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


BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)

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

Применимо для следующих объектов: SQL Server (начиная с SQL Server 2008 до текущей версии).

Значок ссылки на раздел Cинтаксические обозначения в 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 выполняется на сервере ServerA, сеанс вызывает хранимую процедуру на сервере ServerB и еще одну хранимую процедуру на сервере ServerC. Хранимая процедура на сервере ServerC выполняет распределенный запрос к серверу ServerD, и в результате в распределенную транзакцию включаются все четыре сервера. Экземпляр компонента Компонент Database Engine на сервере ServerA является автором транзакции и управляет ею.

Сеансы, вовлеченные в распределенную транзакцию на языке 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.

Примеры

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

Примечание

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

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

См. также

Справочник

BEGIN TRANSACTION (Transact-SQL)

COMMIT TRANSACTION (Transact-SQL)

COMMIT WORK (Transact-SQL)

ROLLBACK TRANSACTION (Transact-SQL)

ROLLBACK WORK (Transact-SQL)

SAVE TRANSACTION (Transact-SQL)