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