次のような形式で、(適切な 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 の列の別のエントリを更新する必要があります)。更新しました)。このケースをどのように処理しますか?
たとえば、これが私のコードで、更新が必要な 3 つのデータベース (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 (またはデータベース呼び出しを提供する最低限の言語) を使用しています。したがって、私の解決策はこれを処理する必要があります。
何か案が?