Распределенные запросы и распределенные транзакции
Компонент 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.