PDOでMysqlのトランザクション処理
PDOでmysqlに接続しトランザクション処理を行っていきます。
トランザクションとは
1つの作業単位として扱われるSQLクエリの集まりです。
複数のUPDATEやINSERTをひとまとまりとして、正常に処理が行われた場合のみデータベースに反映します。
ひとつでも正常に処理が行われなかった場合は、すべての処理結果はデータベースに反映されません。
トランザクションには、ACID特性というものがあり、トランザクション処理において必要とされる4つの要素、Atomicity(原子性)、Consistency(一貫性)、Isolation(独立性)、Durability(永続性)を頭字語で表したものです。
Atomicity(原子性)
トランザクションに含まれる手順が「すべて実行されるか」「すべてされないか」のどちらかになる性質。
Consistency(一貫性)
どんな状況でもトランザクション前後でデータの整合性が矛盾なく保たれる性質。
Isolation(独立性)
トランザクション実行中は、処理途中のデータは外部から隠蔽されて他の処理に影響を与えない性質。
Durability(永続性)
トランザクションが完了したら、システムがクラッシュしてもデータが消失することがない性質。
PDOでトランザクション処理
1 2 | //トランザクション開始 $dbh->beginTransaction(); |
1 2 | //コミット $dbh->commit(); |
1 2 | //ロールバック $dbh->rollBack(); |
上記関数を使い、一連の処理の流れを追っていきます。
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 43 | $dns = "mysql:host=127.0.0.1; dbname=db_name;charset=utf8"; $dns_id = "user_id"; $dns_pw = "password"; try { // MySQLサーバへ接続 $dbh= new PDO($dns, $dns_id, $dns_pw, array(PDO::ATTR_EMULATE_PREPARES => false)); } catch(PDOException $e){ var_dump($e->getMessage()); } try { //トランザクション開始 $dbh->beginTransaction(); //insert $sql = "insert into user (name,address) values (?,?)"; $stmt = $dbh->prepare($sql); $stmt->execute(array($name,$address)); $stmt->closeCursor(); //直近id取得 $last_id_sql = "select last_insert_id() as id from test "; $stmt = $dbh->prepare($last_id_sql); $stmt->execute(); $last_id = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); //直近でinsertしたidを使い、別のテーブルにinsert $sql2 = "insert into hobby (user_id,hobby_name) values (?,?)"; $stmt = $dbh->prepare($sql2); $stmt->execute(array($last_id,$hobby_name)); $stmt->closeCursor(); //コミット $dbh->commit(); } catch (PDOException $e) { //ロールバック $dbh->rollBack(); echo "失敗しました。" . $e->getMessage(); } |
このように簡単な記述でトランザクション処理を行うことができ、「Commit」時に一括更新されるようになります。
トランザクションを利用する場合、途中で実行されるSql,Queryのエラーチェックをしっかり行わなければなりません。
Queryがエラーになったらロールバックして、そのトランザクションの最初から再実行するような仕組みを組み込む必要があります。
Author Profile
スターフィールド編集部
SHARE