見出し画像

【 PHP学習 #30 】 データベース⑥  「PDO トランザクション」  FIREへの旅路 ♯488

今回は、PDOのトランザクションという機能を学びます。

データベース接続編⑤の続きですので、コードなど引き継いでいます。


【 トランザクション 】

トランザクションは、データベースに対する一連の処理(SQL)の整合性を保つための機能です。 複数の処理を一つのまとまった処理として扱うので、一つでも処理が失敗すれば、その全ての処理を無効とすることができます。

https://noumenon-th.net/programming/


トランザクションの説明には、銀行での処理が例に出されます。


▶︎ 例:銀行での処理

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で処理をキャンセルします。


この記事が気に入ったらサポートをしてみませんか?