PHP入門 データベース トランザクション処理

PHPのトランザクション処理について解説します。

トランザクション処理

トランザクションを有効にするには、beginTransactionメソッドでトランザクション開始をします。また、処理の成否を例外として通知するためにPDO::ATTR_ERRMODEパラメーターをPDO::ERRMODE_EXCEPTIONに設定します。

例:トランザクション処理


<?php
require_once './DbManager.php';
try {
// データベースへの接続を確立
$db = getDb();
// 例外処理を有効化
$db->setAttribute (PDO:: ATTR_ERRMODE, PDO:: ERRMODE_EXCEPTION); 
// トランザクションを開始
$db->beginTransaction();
$db->exec("INSERT INTO book (isbn, title, price, publish,published) VALUES ('978-4-7981-2151-1', 'PHP入門', 3200, 'モック社', '2022-04-12')");
// ここで主キー制約違反が発生するはず
$db->exec("INSERT INTO book (isbn, title, price, publish,published) VALUES ('978-4-7981-2151-1', 'PHP上級', 3500, 'ノーマン社', '2023-06-01')");
// すべての処理が成功したら、 トランザクションをコミット 
    $db->commit();
} catch (PDOException $e) {
    // 例外が発生したら、エラーメッセージを表示 & トランザクションをロールバック
    $db->rollBack();
    die("エラーメッセージ: {$e->getMessage()}");
}

トランザクションを開始した場合、それ以降に発行されたSQL命令については、commitメソッドが明示的に呼び出されれるまで更新内容は確定しません。(コミットしないままスクリプトが終了された場合も、更新はロールバックされます)また、rollBackメソッドが呼び出された場合には、トランザクションが開始されてからそれまでの更新を無効にします。

今回のサンプルでは、1つ目のSQLは成功しますが、2つ目のSQLは主キーが重複しているためエラーが発生します。catchブロック内でロールバック処理が呼び出されるため、データはデータベースに書き込まれません。(ロールバックされます。)

実行結果
実行結果