分布式 - 跨多个数据库或服务器 - 事务

IT *_*her 4 sql-server sql-server-2008-r2 transaction rollback

我对 SQL 中的事务有一些疑问。我执行以下步骤。

  1. 为 DB1 数据库打开连接 1
  2. 开始连接 1 的事务
  3. 在连接 1 上运行命令
  4. 为 DB2 数据库打开连接 2
  5. 开始连接 2 的事务
  6. 在连接 2 上运行命令
  7. 为连接 2 提交事务
  8. 为连接 1 提交事务

如果连接 1 上的提交事务失败(回滚),则连接 2 上的事务应该回滚。是否可以?怎么做?

seh*_*ope 9

是的,这可以做到,但您需要第三方充当交易协调员。对此的标准协议称为两阶段提交(2PC)。这通常由充当协调器的事务管理器完成。

这也可以进一步推广到两个以上的数据库。事实上,它甚至不必是数据库,因为该方法通常应用于“事务性资源”。除了数据库之外,另一个常见的事务资源是消息队列。通常的例子是在数据库中执行一些工作(例如:更新帐户余额)并在消息队列上发送一条消息(例如:出站订单)。

为此,您的数据源需要支持 2PC,通常通过XA协议。如何执行取决于特定类型的数据源和编程语言(例如:对于 Java,您将使用XADataSource)。

  • 我还要补充一点,MS DTC(分布式事务协调器)通常用于分发事务。它还支持 XA。 (3认同)