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

Компонент 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 автоматически вызывает интерфейс ITransactionLocal на каждом связанном сервере, который участвует в операции обновления, чтобы свернуть ее в распределенной транзакции. Координатор распределенных транзакций Microsoft затем фиксирует или откатывает их, когда управляющий сервер указывает, что транзакция фиксируется или откатывается.
  • Если параметр SET XACT_ABORT равен OFF, то необходимо, чтобы связанный сервер поддерживал вложенные транзакции, чтобы операции обновления были разрешены. Вложенные транзакции поддерживаются, если поставщик поддерживает вызов метода ITransactionLocal::StartTransaction тогда, когда для сессии уже есть транзакция. Это позволяет SQL Server откатывать отдельные инструкции в распределенных запросах, не откатывая всю транзакцию.

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

См. также

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

Распределенные запросы

Справка и поддержка

Получение помощи по SQL Server 2005