【问题标题】:rollback transactions on multiple databases在多个数据库上回滚事务
【发布时间】:2020-08-08 01:11:54
【问题描述】:

我有多个 PDO 对象,指的是不同服务器上的不同数据库。我需要能够在任何步骤出现错误时回滚所有事务。

其实我也想要这样的东西:

try {
    $db1Connector->beginTransaction();
    $db2Connector->beginTransaction();
    
    //some functionality
    
    $db1Connector->commit();
    $db2Connector->commit();
} catch (\Exception $exception) {
    $db1Connector->rollback();
    $db2Connector->rollback();
}

我的代码中有此功能,但它似乎无法正常工作。我注意到某些情况下只有一个事务被回滚。我猜当$db1Connector->commit()$db2Connector->commit() 失败时会出现这个问题。

【问题讨论】:

  • "1. 有可能吗?" ——你试过吗?您是否遇到过让您相信不是的问题?确切的问题是什么? Edit问题并详细说明。
  • @sticky bit:OP已经展示了代码,不知道分布式事务的概念。您的警务代表了哪些附加值?
  • dbConnector1dbConnector2 是否指向不同的数据库服务器?或同一服务器内的不同数据库?第二种情况最好将其全部合并到跨多个数据库的一个事务中。您当前代码的主要问题是db1Connector->commit() 发生后,如果db2Connector 提交失败,则无法回滚。
  • @danblack 我更新了这个问题。它们位于不同的服务器上。
  • @MiladBarazandeh 正如 danblack 所指出的,您可能最好避免在 MySql 上进行分布式事务,即使理论上它应该可以工作。另一种方法是专门实施一种机制,在单个事务失败的情况下允许恢复。这种机制将特定于您在事务中尝试执行的操作,您应确保相关数据仅通过您的代码进行更新。

标签: php mysql


【解决方案1】:

【讨论】:

  • 请注意,虽然 XA 事务已经存在了很长一段时间,但请避免尝试与 MySQL 的新功能组合。这是一个非常难以实现的概念,并且在各种情况下仍然存在大量错误报告。
猜你喜欢
  • 1970-01-01
  • 2015-08-27
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
相关资源
最近更新 更多