![見出し画像](https://assets.st-note.com/production/uploads/images/84172371/rectangle_large_type_2_1026566f505651dc0949460926b23db4.jpeg?width=800)
【 PHP学習 #30 】 データベース⑥ 「PDO トランザクション」 FIREへの旅路 ♯488
今回は、PDOのトランザクションという機能を学びます。
データベース接続編⑤の続きですので、コードなど引き継いでいます。
【 トランザクション 】
トランザクションは、データベースに対する一連の処理(SQL)の整合性を保つための機能です。 複数の処理を一つのまとまった処理として扱うので、一つでも処理が失敗すれば、その全ての処理を無効とすることができます。
トランザクションの説明には、銀行での処理が例に出されます。
▶︎ 例:銀行での処理
Aさんの口座から、Bさんの口座へ1000円入金処理をする場合。
処理1 Aさんの口座 残高確認
処理2 Aさんの口座から1000円引く
処理3 Bさんの口座に 1000円増やす
こういった流れになります。
もしも、処理2まで完了し、処理3へ移行する際に、通信障害が発生したとします。
そうなると、Aさんの口座から1000円減っただけで処理が終わってしまい問題になります。
このような問題が起こった場合には、処理を中断し、再度、処理1からやり直しになるように設計しておく必要があります。
つまり、処理の最初から、最後までが、ひとまとまりにしておく必要があります。
これを実現するのが、トランザクションです。
【 PDOトランザクション 】
トランザクションは、PDOクラスのメソッドです。
使うメソッドは
beginTransaction トランザクション開始
commit まとまった処理
rollBack もとに戻る
▶︎ 書き方
<?php
//データベースと接続
require 'db_connection.php';
//トランザクション まとまって処理する
$pdo->beginTransaction(); //トランザクションを開始する ・・・・ 解説①
try {
//sql処理
$stmt = $pdo->prepare($sql); //プリペアードステートメント
$stmt->bindValue('id', 2, PDO::PARAM_INT); //紐付け
$stmt->execute(); //実行
$pdo->commit(); //上記sql処理をまとめて処理する ・・・・ 解説②
} catch (PDOException $e) {
$pdo->rollBack(); //更新処理のキャンセル ・・・・ 解説③
}
try catch構文を使い、処理がまとまって完了したら実行し、
まとまって完了しない例外(Exeption)が起きた場合は、処理をキャンセルします。
<解説①>
//トランザクション まとまって処理する
$pdo->beginTransaction(); //トランザクションを開始する ・・・・ 解説①
beginTransaction()メソッドで、トランザクションを開始します。
<解説②>
try {
//sql処理
$stmt = $pdo->prepare($sql); //プリペアードステートメント
$stmt->bindValue('id', 2, PDO::PARAM_INT); //紐付け
$stmt->execute(); //実行
$pdo->commit(); //上記sql処理をまとめて処理する ・・・・ 解説②
} catch (PDOException $e) {
$pdo->rollBack(); //更新処理のキャンセル ・・・・ 解説③
}
try catch構文で、catchの( )内に、PDOExeption $e と書きます。
これは、例外があった場合の処理の書き方です。
pdo->commit(); //上記sql処理をまとめて処理する ・・・・ 解説②
ここで、commit()メソッドを使います。
try{ } の中の、一連のsqlの処理をまとめて実行します。
<解説③>
$pdo->rollBack(); //更新処理のキャンセル ・・・・ 解説③
rollBack()メソッドを使います。
処理をキャンセルするメソッドですが、その条件として、
例外(Exeption)が起きた場合という条件が、try catch構文で指定されます。
<コード全体>
//トランザクション まとまって処理する
$pdo->beginTransaction(); //トランザクションを開始する ・・・・ 解説①
try {
//sql処理
$stmt = $pdo->prepare($sql); //プリペアードステートメント
$stmt->bindValue('id', 2, PDO::PARAM_INT); //紐付け
$stmt->execute(); //実行
$pdo->commit(); //上記sql処理をまとめて処理する ・・・・ 解説②
} catch (PDOException $e) {
$pdo->rollBack(); //更新処理のキャンセル ・・・・ 解説③
}
トランザクション(beginTransaction)を開始し、
sql 処理を try (実行)して
その処理は、commitでまとめて処理します。
もし、この処理が、commitされない
例外(Exception)が起きた場合は、
rollBackで処理をキャンセルします。
この記事が気に入ったらサポートをしてみませんか?