Распределенные запросы и распределенные транзакции

Компонент SQL Server Database Engine позволяет создавать соединения с источниками данных OLE DB, называемые связанными серверами. После подключения к источнику OLE DB можно делать следующее:

Ссылаться на наборы строк источников OLE DB в инструкциях языка Transact-SQL.

  • Передавать команды источникам OLE DB и включать результирующие наборы строк как таблицы в инструкции языка Transact-SQL.

Каждый распределенный запрос может ссылаться на несколько связанных серверов и выполнять операции обновления или считывания отдельно на каждом из связанных серверов. В каждом распределенном запросе могут выполняться операции чтения на одних связанных серверах и операции обновления на других. Обычно компонент Database Engine требует поддержки распределенных транзакций от соответствующего поставщика OLE DB, если в транзакции вероятно обновление данных более чем одного связанного сервера. Следовательно, типы запросов, поддерживаемые для связанного сервера, зависят от уровня поддержки транзакций, имеющихся в поставщиках OLE DB. OLE DB определяет два необязательных интерфейса для управления транзакциями:

  • Интерфейс ITransactionLocal поддерживает локальные транзакции в источниках OLE DB.

  • Интерфейс ITransactionJoin позволяет поставщику присоединиться к распределенной транзакции, которая включает другие менеджеры ресурсов.

    Все поставщики, которые поддерживают интерфейс ITransactionJoin, также поддерживают интерфейс ITransactionLocal.

Если распределенный запрос выполняется при соединении, которое находится в режиме автоматической фиксации, то действуют следующие правила:

  • Для поставщиков, которые не поддерживают интерфейс ITransactionLocal, допустимы только операции считывания.

  • Для поставщиков, которые поддерживают интерфейс ITransactionLocal, допустимы все операции обновления.

    Управляющий экземпляр компонента Database Engine автоматически вызывает интерфейс ITransactionLocal в каждом связанном сервере, который участвует в операции обновления, чтобы начать локальную транзакцию. Он подтверждает транзакции при успешном выполнении инструкции или в противном случае откатывает транзакции.

Если распределенный запрос выполняется на распределенном секционированном представлении или выполняется тогда, когда соединение является явной или неявной транзакцией, действуют следующие правила:

  • Для поставщиков, которые не поддерживают интерфейс ITransactionJoin, допустимы только операции чтения. Поставщики, которые не поддерживают транзакции или поддерживают только интерфейс ITransactionLocal, не могут участвовать в операциях обновления.

  • Если параметр SET XACT_ABORT установлен в ON, для поставщиков, которые поддерживают интерфейс ITransactionJoin, допустимы все операции обновления. Управляющий экземпляр компонента Database Engine автоматически вызывает интерфейс ITransactionJoin на каждом связанном сервере, участвующем в операции обновления, чтобы включить этот сервер в распределенную транзакцию. Координатор распределенных транзакций (Майкрософт) (MS DTC) затем фиксирует или откатывает их, когда управляющий сервер указывает, что транзакция фиксируется или откатывается.

  • Если параметр SET XACT_ABORT равен OFF, то прежде чем будут разрешены операции обновления, связанный сервер должен также поддерживать вложенные транзакции. Вложенные транзакции поддерживаются, если поставщик поддерживает вызов метода ITransactionLocal::StartTransaction тогда, когда для сессии уже есть транзакция. Это позволяет SQL Server откатывать отдельные инструкции в распределенных запросах, не откатывая всю транзакцию.

Приведенные выше правила подразумевают следующее ограничение для поставщиков, которые не поддерживают вложенные транзакции: операции обновления разрешены в распределенной транзакции только в том случае, если параметр XACT_ABORT равен ON.

См. также

Основные понятия