SQLServer之创建分布式事务

时间:2023-12-19 09:20:02

分布式事务创建注意事项

指定一个由 Transact-SQL 分布式事务处理协调器 (MS DTC) 管理的 Microsoft 分布式事务的起点。

执行 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 管理的分布式事务。 连接级别 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 角色的成员身份。

使用T-SQL脚本创建分布式事务

语法:

--声明数据库引用

use 数据库名称;

go

--开启分布式事务

begin distributed { tran | transaction } [ transaction_name | @tran_name_variable ]

beign

数据库事务操作;

end

go

语法解析:

--distributed
--分布式事务关键字标识符

--transaction_name
--用户定义的事务名,用于跟踪 MS DTC 实用工具中的分布式事务。 transaction_name 必须符合标识符规则,字符数必须 <= 32。

--@tran_name_variable
--用户定义的一个变量名,它含有一个事务名,该事务名用于跟踪 MS DTC 实用工具中的分布式事务。 必须使用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。

示例:

--声明数据库引用
use testss;
go

--开启分布式事务
begin distributed transaction distributedtran
begin
declare @rowcounts int =0;

insert into Tests.dbo.test1(name,sex,height,age,classid) values('分布式事务测试','女','178','20','1');
set @rowcounts=@rowcounts+(select @@ROWCOUNT);

insert into testss.dbo.test1(name,sex,height,age,classid) values('分布式事务测试','女','178','20','1');
set @rowcounts=@rowcounts+(select @@ROWCOUNT);

if @rowcounts=2
commit transaction distributedtran;
else
rollback transaction distributedtran;
end
go

示例结果:

SQLServer之创建分布式事务