この記事について
| 環境 | 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 "ロールバックしました";
}
