トランザクションは、データベースに対する一連の処理(SQL)の整合性を保つための機能です。複数の処理を一つのまとまった処理として扱うので、一つでも処理が失敗すれば、その全ての処理を無効とすることができます。
スポンサーリンク
全ての処理が成功し、データベースに反映させることをコミットと呼びます。また、もし途中で処理が失敗すれば、トランザクション内の処理は全て無効とします。これをロールバックと呼びます。
今回は下記のnameテーブルを対照にトランザクション処理を行っています。
MySQLにつないでテーブルデータを表示させる[SELECT][PDO]
テーブルタイプはInnoDBを設定しています。MyISAM形式はトランザクション機能がないので注意して下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?php header("Content-type: text/html; charset=utf-8"); $dsn = 'mysql:host=◯◯◯;dbname=sample01;charset=utf8'; $user = '◯◯◯'; $password = '◯◯◯'; //DB接続 try { $dbh = new PDO($dsn, $user, $password); }catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } try{ //例外処理を投げる(スロー)ようにする $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //トランザクション開始 $dbh->beginTransaction(); $dbh->exec("INSERT INTO name (name) VALUES ('太郎') "); $dbh->exec("INSERT INTO name (name) VALUES ('花子') "); //namesというカラムは存在しない //$dbh->exec("INSERT INTO name (names) VALUES ('ウェブの葉') "); // トランザクション完了(コミット) $dbh->commit(); echo "登録成功"; }catch (PDOException $e){ //トランザクション取り消し(ロールバック) $dbh->rollBack(); print('Error:'.$e->getMessage()); echo "<p>登録失敗</p>"; die(); } //データベース接続切断 $dbh = null; |
18行目
setAttribute()関数でPDOExceptionを投げるようにしておきます。
もし途中の処理でエラーが発生すると、34行目においてロールバック処理が行われます。試しに27行目において存在しないnamesカラムを指定して、わざとエラーを発生させるようにしています。この場合、もちろん上記2つのinsert処理は実行されません。
21行目
トランザクション処理が行われると、データベースへの処理は29行目のcommit()が呼ばれるまでは、実際に反映されません。
参照ページ
PHPマニュアル