1. ホーム
  2. php

[解決済み】PHP + MySQL トランザクションの例

2022-03-29 14:07:11

質問

MySQLのトランザクションが使用されているPHPファイルの正常な例を、私は本当に見つけられませんでした。その簡単な例を示してもらえますか?

そしてもう一つ質問です。私はすでに多くのプログラミングを行いましたが、トランザクションは使いませんでした。PHPの関数か何かを header.php もし、ある mysql_query 失敗したら、他も失敗するのか?


わかったような気がするのですが、正しいのでしょうか?

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");
}

解決方法は?

私がトランザクションを扱うときに一般的に使っている考え方は、次のようなものです。 (半擬似コード) :

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
}



この考え方では、クエリに失敗した場合、Exceptionを投げなければならないことに注意してください。
  • PDOは、設定次第でそれが可能です。
  • 他のAPIでは、クエリを実行するために使用した関数の結果をテストして、自分で例外を投げなければならないかもしれません。


残念ながら、魔法は使えません。どこかに指示を出せば、自動的にトランザクションが実行されるわけではありません。トランザクションで実行しなければならないクエリー群を特定しなければならないのです。

例えば、トランザクションの前にいくつかのクエリーを用意することがよくあります。 (の前)。 begin ) と、トランザクションの後にもう2つほどクエリを実行します。 (どちらかの後に commit または rollback ) そして、これらのクエリは何が起きても実行されるようにします。 (あるいは) トランザクションの中で