.Water-Sunlight
.サイトメニュー
.検索
.オンライン状況
登録ユーザ: 0
ゲスト: 7
.
<< Prev
SELECT文の実行
« INDEX »
PHP データベース編
Next >>
付録
作成日: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

<< Prev
SELECT文の実行
« INDEX »>
Page Top
Next >>
付録

.