BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
适用于: SQL Server Azure SQL 托管实例
指定 Transact-SQL 分布式事务的启动。 使用 SQL Server 时,分布式事务由 Microsoft 分布式事务处理协调器 (MS DTC) 管理。
- 对于 Azure SQL 托管实例,分布式事务由服务本身管理,而不是由 MS DTC 管理。 有关 Azure SQL 数据库和 Azure 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 数据类型声明该变量 。
注解
执行 BEGIN DISTRIBUTED TRANSACTION 语句的 SQL Server 数据库引擎的实例是事务创建者,并控制事务的完成。 当为会话发出后续 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句时,控制实例请求 MS DTC 在所涉及的所有实例间管理分布式事务的完成。
事务级别的快照隔离不支持分布式事务。
数据库引擎的远程实例登记到分布式事务中的主要方法是当已在分布式事务中登记的会话执行引用链接服务器的分布式查询时。
例如,如果在服务器 A 上发出 BEGIN DISTRIBUTED TRANSACTION,则该会话将调用服务器 B 上的一个存储过程和服务器 C 上的另一个存储过程。 服务器 C 上的存储过程执行针对服务器 D 的分布式查询,这样该分布式事务将涉及所有四台计算机。 服务器 A 上的数据库引擎的实例是该事务的初始控制实例。
Transact-SQL 分布式事务涉及的会话并不获取可以传递给另一个会话的事务对象,从而也不能将其显式登记在分布式事务中。 远程服务器登记到事务中的唯一方法是成为分布式查询或远程存储过程调用的目标。
在本地事务中执行分布式查询时,如果目标 OLE DB 数据源支持 ITransactionLocal,则该事务被自动提升为分布式事务。 如果目标 OLE DB 数据源不支持 ITransactionLocal,则只允许在分布式查询中执行只读操作。
已在分布式事务中登记的会话执行一个引用远程服务器的远程存储过程调用。
sp_configure remote proc trans 选项控制对本地事务中的远程存储过程调用是否自动使本地事务被提升为由 MS DTC 管理的分布式事务sp_configure remote proc trans
。 连接级别 SET 选项 REMOTE_PROC_TRANSACTIONS 可用于覆盖由 sp_configure remote proc trans
建立的实例默认值。 启用此选项后,远程存储过程调用会导致一个本地事务提升为分布式事务。 创建 MS DTC 事务的连接成为该事务的创建者。 COMMIT TRANSACTION 初始化一个 MS DTC 协调的提交。 如果启用了 sp_configure remote proc trans 选项,本地事务中的远程存储过程调用将被自动保护,成为分布式事务的一部分,而不需要重写应用程序以便专门发出 BEGIN DISTRIBUTED TRANSACTION 而不是 BEGIN TRANSACTIONsp_configure remote proc trans
。
有关分布式事务环境和处理的详细信息,请参阅 Microsoft 分布式事务处理协调器文档。
权限
要求具有 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