MySQL トランザクションが使用されている PHP ファイルの通常の例を実際に見つけることができませんでした。簡単な例を見せてもらえますか?
もう 1 つ質問があります。私はすでに多くのプログラミングを行ってきましたが、トランザクションは使用していません。1header.php
つの関数が失敗した場合にmysql_query
他の関数も失敗するような PHP 関数などを追加できますか?
理解できたと思いますが、正しいでしょうか?
mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
$a1 = mysql_query("INSERT INTO rarara (l_id) VALUES('1')");
$a2 = mysql_query("INSERT INTO rarara (l_id) VALUES('2')");
if ($a1 and $a2) {
mysql_query("COMMIT");
} else {
mysql_query("ROLLBACK");
}
ベストアンサー1
トランザクションを扱うときに私が一般的に使用する考え方は次のようになります(半疑似コード) :
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
)にいくつかのクエリがあり、トランザクションの後( または の後commit
)rollback
に別のいくつかのクエリがある場合、トランザクションで何が起こったか(または起こらなかったか)に関係なく、それらのクエリを実行する必要があります。