PHP Data Object (PDO)でトランザクションを利用する 第3回
PHP Data Object (PDO)を使ってデータベースのデータを操作します。データベースのデータの整合性を保つため、トランザクションを利用します。
PDOは、PHPの拡張モジュールでデータベースを操作するためのインタフェースです。PDOを使ってトランザクションを利用するには、トランザクションをサポートしているデータベースが必要です。
トランザクション
トランザクションは、データベースのデータの整合性を保つための方法です。
トランザクション内でデータを変更するためのSQLを実行します。その後、変更の確定(コミット)を行い、データベースに変更を反映させます。
トランザクション開始から変更確定までの間、他の接続は、確定前の変更結果を見ることができません。また、確定前のデータを変更することができません。
このようにして、データベースに矛盾したデータが生成されないように、他の接続からデータを守ります。
補足
変更の確定前であれば、データの変更をデータベースに反映させず、取り消すこと(ロールバック)ができます。
自動コミットモード
自動コミットモードは、データベース固有のPDOドライバがトランザクションをサポートしているか否かにより、トランザクションを利用するか否かが決まるモードです。
PDOドライバはデータベース固有で、データベースごとに異なります。
使用するPDOドライバがトランザクションをサポートしていない場合は、トランザクションを使用せずに、SQLが実行されます。
使用するPDOドライバがトランザクションをサポートしている場合は、暗黙的なトランザクションで、SQLが実行されます。
最初にPDOでデータベースに接続した時、自動コミットモードの接続となります。
事前準備
- PHPをインストールします。
- トランザクションをサポートしているデータベースをインストールします。
- 2でインストールしたデータベースのPDOドライバが使えるように、php.iniファイルを設定します。
php.iniファイルの設定に関しては PHP Data Object(PDO)拡張モジュールの導入とPDOインスタンスの作成 第1回 - プログラミングノート をご覧ください。
手順
1.トランザクションを開始する
2.データを変更するためSQLを実行する
3.変更の確定・取消を行う
1.トランザクションを開始する
PDOクラスのbeginTransactionメソッドを使って、トランザクションを開始します。
データベース固有のPDOドライバがトランザクションをサポートしていない場合、PDOExceptionが発生します。
MySQL データベースの MyISAM テーブルではトランザクションを利用できませんが、エラーが発生することなく、beginTransaction()は True を返します。これは、PDOがデータベース固有のPDOドライバで、トランザクションのサポートをチェックしているためです。
詳しくは、PHP: PDO::beginTransaction - Manual をご覧ください。
2.データを変更するためSQLを実行する
トランザクションの開始後、クエリ実行、登録・更新・削除のSQLを実行します。
例えば、クエリを実行してデータを抽出し、そのデータをもとにデータを更新するなどの処理を行います。
3.変更の確定・取消を行う
最初に、トランザクション内で行った処理が成功か失敗を判定します。
成功の場合は、PDOクラスのcommitメソッドを使って、変更の確定(コミット)を行います。コミットを行うと、トランザクション内で行ったすべての変更がデータベースに反映されます。
失敗の場合は、PDOクラスのrollbackメソッドを使って、変更の取消(ロールバック)を行います。ロールバックを行うと、トランザクション内で行ったすべての変更が取り消され、データベースに反映されません。
詳しくは、PHP: PDO::commit - Manual 、PHP: PDO::rollBack - Manual をご覧ください。
補足
トランザクション内の変更に対して確定・取消が行われずに、スクリプトが終了したり接続が閉じられる場合、PDOはそのトランザクション内の変更の取消(ロールバック)をします。
注意
MySQLなど一部データベースでは、トランザクション内でデータベース定義SQL
(CREATE TABLE など)が実行されると、自動で確定(コミット)されます。
try {
$dbh->beginTransaction(); // トランザクションの開始
// トランザクション内で、クエリ実行、登録・更新・削除のSQL実行
$dbh->commit(); // 変更の確定
} catch (Exception $e) {
$dbh->rollBack(); // 変更の取消
}
記事一覧
第1回 PHP Data Object(PDO)拡張モジュールの導入とPDOインスタンスの作成
第2回 PHP Data Object (PDO)でプリペアステートメントを使う
第3回 PHP Data Object (PDO)でトランザクションを利用する
参照
PHP: トランザクションおよび自動コミット - Manual