読者です 読者をやめる 読者になる 読者になる

プログラミングノート

プログラミングの備忘録です

PHP Data Object (PDO)でトランザクションを利用する 第3回

 PHP Data Object (PDO)を使ってデータベースのデータを操作します。データベースのデータの整合性を保つため、トランザクションを利用します。

 PDOは、PHPの拡張モジュールでデータベースを操作するためのインタフェースです。PDOを使ってトランザクションを利用するには、トランザクションをサポートしているデータベースが必要です。

 

トランザクション

 トランザクションは、データベースのデータの整合性を保つための方法です。

 トランザクション内でデータを変更するためのSQLを実行します。その後、変更の確定(コミット)を行い、データベースに変更を反映させます。

 トランザクション開始から変更確定までの間、他の接続は、確定前の変更結果を見ることができません。また、確定前のデータを変更することができません。

 このようにして、データベースに矛盾したデータが生成されないように、他の接続からデータを守ります。

 

補足

 変更の確定前であれば、データの変更をデータベースに反映させず、取り消すこと(ロールバック)ができます。

 

自動コミットモード

  自動コミットモードは、データベース固有のPDOドライバがトランザクションをサポートしているか否かにより、トランザクションを利用するか否かが決まるモードです。

 PDOドライバはデータベース固有で、データベースごとに異なります。

 使用するPDOドライバがトランザクションをサポートしていない場合は、トランザクションを使用せずに、SQLが実行されます。

 使用するPDOドライバがトランザクションをサポートしている場合は、暗黙的なトランザクションで、SQLが実行されます。

 最初にPDOでデータベースに接続した時、自動コミットモードの接続となります。

 

事前準備

  1. PHPをインストールします。
  2. トランザクションをサポートしているデータベースをインストールします。
  3. 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