BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)

Область применения: SQL Server Управляемый экземпляр SQL Azure

Объявляет начало распределенной транзакции Transact-SQL. При использовании SQL Server распределенная транзакция управляется координатором распределенных транзакций Майкрософт (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 ядро СУБД, выполняющий инструкцию BEGIN DISTRIBUTED TRANSACTION, является источником транзакций и управляет завершением транзакции. Если после этого в сеансе выполняется инструкция COMMIT TRANSACTION или ROLLBACK TRANSACTION, управляющий экземпляр передает координатору MS DTC управление распределенной транзакцией во всех экземплярах.

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

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

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

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

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

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

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

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

Разрешения

Требуется членство в роли public.

Примеры

В этом примере кандидат из базы данных AdventureWorks2022 удаляется как на локальном экземпляре ядро СУБД, так и на удаленном сервере. И локальная, и удаленная база данных зафиксирует транзакцию или выполнит ее откат.

Примечание.

Если ms DTC в настоящее время не установлен на компьютере под управлением экземпляра ядро СУБД, в этом примере возникает сообщение об ошибке. Дополнительные сведения об установке координатора MS DTC см. в документации по координатору распределенных транзакций Microsoft.

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

Следующие шаги