我们都知道,我们总是可以将数据库调用包装在事务中(有或没有适当的 ORM),形式如下:
$con = Propel::getConnection(EventPeer::DATABASE_NAME);
try {
$con->begin();
// do your update, save, delete or whatever here.
$con->commit();
} catch (PropelException $e) {
$con->rollback();
throw $e;
}
这种方式可以保证如果事务失败,数据库会恢复到正确的状态。
但问题是,假设当我进行事务时,除了该事务之外,我还需要更新另一个数据库(例如,当我更新 databaseA 中的列中的条目时,databaseB 中的列中的另一个条目必须是更新)。如何处理这种情况?
假设这是我的代码,我有三个需要更新的数据库(dbA、dbB、dbc):
$con = Propel::getConnection("dbA");
try {
$con->begin();
// update to dbA
// update to dbB
//update to dbc
$con->commit();
} catch (PropelException $e) {
$con->rollback();
throw $e;
}
如果 dbc 失败,我可以回滚 dbA 但不能回滚 dbb。
我认为这个问题应该与数据库无关。由于我使用的是 ORM,所以这也应该是独立于 ORM 的。
更新:一些数据库事务包装在 ORM 中,一些使用裸 PDO、oledb(或任何提供数据库调用的最低限度语言)。所以我的解决方案必须注意这一点。
任何想法?