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