トランザクションを操作するときに私が一般的に使用するアイデアは、次のようになります(semi-pseudo-code) :
try {
// First of all, let's begin a transaction
$db->beginTransaction();
// A set of queries; if one fails, an exception should be thrown
$db->query('first query');
$db->query('second query');
$db->query('third query');
// If we arrive here, it means that no exception was thrown
// i.e. no query has failed, and we can commit the transaction
$db->commit();
} catch (\Throwable $e) {
// An exception has been thrown
// We must rollback the transaction
$db->rollback();
throw $e; // but the error must be handled anyway
}
このアイデアでは、クエリが失敗した場合、例外をスローする必要があることに注意してください。
- PDOは、構成方法に応じて、これを実行できます
-
PDO::setAttribute
を参照してください。 - および
PDO::ATTR_ERRMODE
およびPDO::ERRMODE_EXCEPTION
-
- それ以外の場合、他のAPIを使用すると、クエリの実行に使用された関数の結果をテストし、自分で例外をスローする必要がある場合があります。
残念ながら、魔法は関係していません。命令をどこかに置いてトランザクションを自動的に実行することはできません。トランザクションで実行する必要のあるクエリのグループを指定する必要があります。
たとえば、トランザクションの前(begin
の前)にいくつかのクエリが発生することがよくあります。 ) トランザクション後の別の2つのクエリ(commit
の後) またはrollback
) そして、何が起こったとしても、それらのクエリを実行する必要があります(またはそうでない) トランザクションで。