Transact-SQL 分布式事务

在 Transact-SQL 中启动的分布式事务的结构相对比较简单:

  1. Transact-SQL 脚本或应用程序连接执行启动分布式事务的 Transact-SQL 语句。

  2. 执行该语句的 SQL Server 数据库引擎实例将成为事务中的主控服务器。

  3. 然后,脚本或应用程序要么对链接服务器执行分布式查询,要么对远程服务器执行远程存储过程。

  4. 当执行了分布式查询或远程过程调用后,主控服务器将自动调用 Microsoft 分布式事务处理协调器 (MS DTC) 来登记分布式事务中的链接服务器和远程服务器。

  5. 当脚本或应用程序发出 COMMIT 或 ROLLBACK 语句时,主控 SQL Server 实例将调用 MS DTC 来管理两阶段提交过程,或者通知链接服务器和远程服务器回滚它们的事务。

必需的 Transact-SQL 语句

用于控制分布式事务的 Transact-SQL 语句很少,因为多数工作都由 SQL Server 数据库引擎和 MS DTC 在内部完成。在 Transact-SQL 脚本或应用程序中必需的 Transact-SQL 语句只是那些执行以下操作所需的语句:

  • 启动分布式事务。

  • 对链接服务器执行分布式查询,或对远程服务器执行远程过程调用。

  • 调用标准的 Transact-SQL COMMIT TRANSACTION、COMMIT WORK、ROLLBACK TRANSACTION 或 ROLLBACK WORK 语句来完成事务。

    对于任一 Transact-SQL 分布式事务,用于处理 Transact-SQL 脚本或连接的数据库引擎实例将自动调用 MS DTC 来协调事务的提交或回滚。

启动分布式事务

可以通过以下方式在 Transact-SQL 中启动分布式事务:

  • 使用 BEGIN DISTRIBUTED TRANSACTION 语句启动显式分布式事务。

    还可以对链接服务器执行分布式查询。所连接到的数据库引擎实例将调用 MS DTC,以便用链接服务器来管理分布式事务。您还可以将数据库引擎远程实例上的远程存储过程作为分布式事务的一部分来调用。

  • 当处理本地事务时,可执行分布式查询。

    如果 OLE DB 数据源支持 ITransactionJoin 接口,则即使查询是只读查询,该事务也会被提升为分布式事务。如果该数据源不支持 ItransactionJoin,则只允许只读语句。

  • 如果已经执行了 SET REMOTE_PROC_TRANSACTIONS ON,而且本地事务调用了另一个数据库引擎实例上的远程存储过程,则该本地事务将被提升为分布式事务。

    数据库引擎使用 MS DTC 与远程服务器协调事务。如果将 REMOTE_PROC_TRANSACTIONS 设置为 OFF,则对远程存储过程的调用将在本地事务的作用域之外执行。如果回滚本地事务,将不回滚由远程过程所完成的工作。由远程存储过程所做的工作将在该过程完成时提交,而不是在提交本地事务时提交。

REMOTE_PROC_TRANSACTIONS 选项是一个兼容性选项,该选项只影响对使用 sp_addserver 定义的远程服务器进行的远程存储过程调用。该选项不适用于对使用 sp_addlinkedserver 定义的链接服务器执行存储过程的分布式查询。有关分布式查询的详细信息,请参阅分布式查询