Skip to content

48. Распределенные запросы и распределенные транзакции в SQL Server

Pandas edited this page Jan 7, 2018 · 1 revision

Распределенные запросы используются для доступа к данным из нескольких разнородных источников данных. Эти источники данных могут храниться на одном или различных компьютерах.

Пользователи SQL Server могут применять распределенные запросы для доступа к следующим данным:

  • Распределенные данные, хранящиеся в нескольких экземплярах SQL Server.
  • Разнородные данные, хранящиеся в различных реляционных и нереляционных источниках данных, доступ к которым осуществляется с использованием поставщика OLE DB.

Инструкции Transact-SQL, контролирующие распределенные транзакции, немногочисленны, поскольку большая часть работы производится внутри экземпляра SQL Server Database Engine и MS DTC. Ниже представлены инструкции Transact-SQL, которые необходимо выполнить в сценарии или приложении Transact-SQL:

  1. Запуск распределенной транзакции.
  2. Выполнение распределенных запросов к связанным серверам или выполнение удаленного вызова процедур на удаленных серверах.
  3. Вызов стандартных инструкций Transact-SQL COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION или ROLLBACK WORK для завершения транзакции.

Для любой распределенной транзакции Transact-SQL экземпляр Database Engine, обрабатывающий соединение или сценарий Transact-SQL, автоматически вызывает MS DTC для координации ее фиксации или отката.

Запуск распределенных транзакций

Распределенную транзакцию в Transact-SQL можно запустить следующими способами:

  1. Явно начать распределенную транзакцию, используя инструкцию BEGIN DISTRIBUTED TRANSACTION. Можно также выполнить распределенный запрос к связанному серверу. Экземпляр компонента Database Engine вызовет MS DTC для обслуживания распределенной транзакции на связанном сервере. В рамках распределенной транзакции можно также вызвать удаленные хранимые процедуры на удаленном экземпляре компонента Database Engine.
  2. Находясь в локальной транзакции, выполнить распределенный запрос. Если источник данных OLE DB поддерживает интерфейс ITransactionJoin, транзакция превращается в распределенную, даже если этот запрос является запросом только для чтения. Если источник данных не поддерживает интерфейс ITransactionJoin, допустимы лишь инструкции только для чтения.
  3. Если была выполнена инструкция SET REMOTE_PROC_TRANSACTIONS ON и локальная транзакция вызывает удаленную хранимую процедуру на другом экземпляре компонента Database Engine, локальная транзакция становится распределенной. Компонент Database Engine использует MS DTC, чтобы координировать транзакцию с удаленным сервером. Обращения к удаленным хранимым процедурам выполняются вне области локальной транзакции, если REMOTE_PROC_TRANSACTIONS установлен в OFF. При откате локальной транзакции изменения, сделанные удаленной процедурой, не возвращаются. Фиксация изменений, произведенных удаленной хранимой процедурой, производится во время ее завершения, а не при фиксации локальной транзакции.
Clone this wiki locally