【MYSQL+PHP】トランザクション処理のサンプルコード

この記事について

環境PHP、mysql(InnoDB)
目的MYSQL+PHPでトランザクション処理を行う
結果SET AUTOCOMMIT=0とbeginで開始し、commit/rollbackで確定・巻き戻しする

つまずきポイント要約

  • 通常は自動コミットが有効。SET AUTOCOMMIT=0にしないとクエリ入力後すぐ更新される
  • コミットせずに接続を閉じた場合もロールバックされるよう

MYSQL + PHPでトランザクションを行うための記述例

トランザクションのサンプルコード

//通常は、自動コミットが有効になっているのでクエリ入力後、すぐにコミット(データベースの更新処理)が行われる。
//トランザクション処理を行うため「SET AUTOCOMMIT=0」で自動コミットを無効する。

mysql_query("SET AUTOCOMMIT = 0");  //オートコミットを無効にする
mysql_query("begin"); //トランザクション開始



//----この間に複数の処理を記述----------------------------------


$sql1 = "UPDATE テーブル名1 WHERE ~"; //処理1
mysql_query($sql1) OR die(mysql_error());

$sql2 = "DELETE FROM テーブル名2 WHERE ~"; //処理2
mysql_query($sql2) OR die(mysql_error());


//----この間に複数の処理を記述 ここまで-------------------------


mysql_query("commit"); //ここで上記二つの処理が同時に実行される

//commitがないので絶対にテーブルは更新されないサンプルコード

mysql_query("SET AUTOCOMMIT = 0"); 
mysql_query("begin"); //トランザクション開始

$sql1 = "UPDATE テーブル名1 WHERE ~"; //処理1
mysql_query($sql1) OR die(mysql_error());

$sql2 = "DELETE FROM テーブル名2 WHERE ~"; //処理2
mysql_query($sql2) OR die(mysql_error());

mysql_query("rollback"); //ロールバックなので実行されない

※仮にロールバックがなくても、コミットせずに接続を閉じても、MySQLはそのトランザクションをロールバックするよう。

コミットとロールバックを細かく振り分けるなら、次のような記述ができる。

コミットとロールバックを振り分けるサンプルコード

$sql1 = "UPDATE テーブル名1 WHERE ~"; //処理

$result = mysql_query($sql1);

if( $result === true ){

  mysql_query("commit"); //確定
  print "コミットしました";

}else{

  mysql_query("rollback"); //巻き戻し
  print "ロールバックしました"; 

}

関連記事

タイトルとURLをコピーしました