Поделиться через


BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)

Запускает распределенную транзакцию на языке Transact-SQL, управляемую координатором распределенных транзакций (Майкрософт) (MS DTC).

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

BEGIN DISTRIBUTED { TRAN | TRANSACTION } 
     [ transaction_name | @tran_name_variable ] 
[ ; ]

Аргументы

  • transaction_name
    Имя пользовательской транзакции, используемой для отслеживания распределенной транзакции в служебных программах MS DTC. Аргумент transaction_name должен соответствовать правилам для идентификаторов и иметь длину не более 32 символов.

  • @tran\_name\_variable
    Имя пользовательской переменной, содержащей имя транзакции, которая используется для отслеживания распределенной транзакции в служебных программах координатора MS DTC. Эта переменная должна иметь тип данных char, varchar, nchar или nvarchar.

Замечания

Экземпляр компонента SQL Server Database Engine, на котором выполняется инструкция BEGIN DISTRIBUTED TRANSACTION, является инициатором транзакции, контролирующим ее завершение. Если после этого в сеансе выполняется инструкция COMMIT TRANSACTION или ROLLBACK TRANSACTION, управляющий экземпляр передает координатору MS DTC управление распределенной транзакцией во всех экземплярах.

Изоляция моментального снимка уровня транзакции не поддерживает распределенные транзакции. Дополнительные сведения см. в разделе Использование уровней изоляции строк на основе управления версиями.

Основным способом прикрепления удаленных экземпляров компонентов Database Engine к распределенной транзакции является выполнение распределенного запроса, ссылающегося на связанный сервер, в сеансе, который уже прикреплен к распределенной транзакции.

Например, если инструкция BEGIN DISTRIBUTED TRANSACTION выполняется на сервере А, сеанс вызывает хранимую процедуру на сервере Б и еще одну хранимую процедуру на сервере В. Хранимая процедура на сервере В выполняет распределенный запрос к серверу Г, и в результате в распределенную транзакцию включаются все четыре сервера. Экземпляр компонента Database Engine на сервере А является автором транзакции и управляет ею.

Сеансы, вовлеченные в распределенную транзакцию на языке Transact-SQL, не получают объект транзакции, который они могли бы передать другому сеансу, чтобы явным образом прикрепить его к распределенной транзакции. Единственный способ, при помощи которого удаленный сервер можно прикрепить к распределенной транзакции, — это представить его в качестве целевого сервера для удаленного запроса или вызова удаленной хранимой процедуры.

Если в локальной транзакции выполняется распределенный запрос, ее уровень автоматически повышается до распределенной при условии, что целевой источник данных OLE DB поддерживает интерфейс ITransactionLocal. Если целевой источник данных OLE DB не поддерживает интерфейс ITransactionLocal, в распределенном запросе разрешаются только операции чтения.

Сеанс, уже прикрепленный к распределенной транзакции, выполняет удаленную хранимую процедуру, ссылаясь на удаленный сервер.

Параметр sp_configure remote proc trans управляет тем, будет ли уровень локальной транзакции, вызывающей удаленные хранимые процедуры, автоматически повышаться до распределенной транзакции, управляемой координатором MS DTC. Установка параметра уровня соединения REMOTE_PROC_TRANSACTIONS может использоваться для переопределения значения по умолчанию, установленного процедурой sp_configure remote proc trans для экземпляра. Если этот параметр включен, вызов удаленной хранимой процедуры приводит к повышению уровня локальной транзакции до распределенной транзакции. Соединение, создающее транзакцию координатора MS DTC, становится инициатором этой транзакции. Инструкция COMMIT TRANSACTION фиксирует транзакцию, управляемую координатором MS DTC. Если параметр sp_configure remote proc trans включен (ON), вызовы удаленных хранимых процедур в локальной транзакции автоматически защищаются как часть распределенной транзакции. При этом не требуется переписывать приложения с целью замены инструкций BEGIN TRANSACTION на BEGIN DISTRIBUTED TRANSACTION.

Дополнительные сведения о среде и обработке распределенных транзакций см. в документации по координатору распределенных транзакций (Майкрософт).

Разрешения

Необходимо быть членом роли public.

Примеры

В этом примере удаляется кандидат из базы данных AdventureWorks как на локальном экземпляре компонента Database Engine, так и на удаленном сервере. И локальная, и удаленная база данных зафиксирует транзакцию или выполнит ее откат.

ПримечаниеПримечание

Этот пример приводит к сообщению об ошибке, если координатор MS DTC не установлен на компьютере, где выполняется экземпляр компонента Database Engine. Дополнительные сведения об установке координатора MS DTC см. в документации по координатору распределенных транзакций Microsoft.

USE AdventureWorks;
GO
BEGIN DISTRIBUTED TRANSACTION;
-- Delete candidate from local instance.
DELETE AdventureWorks.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
-- Delete candidate from remote instance.
DELETE RemoteServer.AdventureWorks.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
COMMIT TRANSACTION;
GO