Мы все знаем, что мы всегда можем заключить наш вызов базы данных в транзакцию (с или без надлежащего 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, другую запись в столбце в база данныхB должна быть обновлена). Как справиться с этим делом?
Допустим, это мой код, у меня есть три базы данных, которые необходимо обновить (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 (или любой другой язык базы данных, предоставляемый вызовами). Поэтому мое решение должно позаботиться об этом.
Есть идеи?