作成日:2006/06/17
3C.7 トランザクション処理
例題(SQLフォーム)ではトランザクション処理に関するコードが含まれていませんが、 データベースを扱ったプログラミングでは避けて通れません。 SQLフォームでトランザクション処理を実行するには以下のようにSQLスクリプトを書きます。
transaction.sql
# テーブルからデータを削除 DELETE FROM syain; # テーブルにデータを挿入 EVAL $db->autoCommit(false); INSERT INTO syain VALUES(1,'Suzuki',3); # テーブルの検索 SELECT * FROM syain; EVAL $db->rollback(); SELECT * FROM syain;
EVAL文の中の変数 $db は現在接続しているデータベースオブジェクトを表します。 上の例ではINSERT文に先立ち autoCommit(false) で自動コミットモードを無効にしてます。 そして rollback() を呼び出し、INSERT文をロールバックしています。 当然、rollback() の前後でSELECT文の結果が異なります。
実行結果

トランザクション関連のメソッド
| メソッド | 説明 |
|---|---|
mixed DB_common::autoCommit ([boolean $onoff = FALSE]) |
自動コミットを有効にする場合に TRUE、無効にする場合に FALSE を指定します。 成功した場合は DB_OK 失敗した場合は DB_Error オブジェクトを返します。 |
mixed DB_common::commit() |
トランザクションをロールバックします。 成功した場合は DB_OK 失敗した場合は DB_Error オブジェクトを返します。 |
mixed DB_common::rollback() |
トランザクションをコミットします。 成功した場合は DB_OK 失敗した場合は DB_Error オブジェクトを返します。 |
データベースによっては手動トランザクション処理( 自動コミットモード無効 )をサポートしていない場合があるので注意して下さい。
データベースが手動トランザクションをサポートしていても PEAD::DB 自体は対応してない事もあります。
筆者の環境のSQLiteでは autoCommit()/rollback() が効きませんでしたが、
SQL文でBEGIN TRANSACTION/COMMIT TRANSACTIONを発行するとOKでした。
MySQLではトランザクションセーフなテーブル(InnoDBなど)と非トランザクションセーフなテーブル(MyISAMなど)を作る事ができます。
手動トランザクションが使えるのはトランザクションセーフなテーブルだけです。
MyISAMなどの非トランザクションセーフなテーブルの場合は、データベースの変更は直ちにコミットされます。
MySQLの詳しいトランザクション処理については、筆者の運営するWikiサイト( groud-sunlight ) に詳しく説明してあります。
無料で揃える開発環境:MySQL4.1/9.MySQLの実験/4.トランザクション --- groud-sunlight
