準備と実行 (Previous) (Next) モジュール

View this page in Last updated: Sun, 05 Oct 2008
English | Dutch | French | German | Hungarian | Japanese | Polish | Russian | Spanish | Plain HTML

トランザクション

トランザクション -- トランザクションの処理

説明

PEAR MDB2 は、デフォルトですべてのクエリについて自動コミットを行います。 しかし、 beginTransaction() を使用することで新たなトランザクションを開始し、それを commit() および rollback() で終了させることも可能です。 これらの 3 つのメソッドは、すべてオプションでセーブポイント文字列を指定することが可能です。 これを使用することで、対応する場所での開放やロールバックが可能となります。 inTransaction() メソッドを使用すると、 現在トランザクションがオープンしているのかどうかを調べることができます。

警告

PEAR MDB2 は、トランザクションやセーブポイントの エミュレートは行いません。つまり、MDB2 でトランザクションが使用できるといっても それはバックエンドの RDBMS (そして MySQL の場合は 使用するストレージエンジン) に依存するということです。 また、一部の RDBMS では DDL 文を実行すると 暗黙的にトランザクションがコミットされてしまうことにも注意しましょう - 明白な例外は Oracle および PostgreSQL です。

MDB2 は "入れ子状の" トランザクションもサポートしています。これを利用するには beginNestedTransaction() メソッドを使用します。 実際のところこれは、例えば Interbase でネイティブにサポートされているような 真の入れ子状トランザクションではありません。 MDB2 は、入れ子のトランザクションが何件オープンしているのかのカウンタを内部で管理します。 completeNestedTransaction() のコールによってトランザクションが終了すると、このカウンタを 1 減らします。 RDBMS がセーブポイントをサポートしている場合は、初回以外の beginNestedTransaction() メソッドのコール時に MDB2 が自動的にセーブポイントを設定し、その名前を返します。 このセーブポイントは、 completeNestedTransaction() メソッドによって自動的に開放されます。自動生成されるセーブポイントの名前は、 オプション "savepoint_format" (デフォルトは 'MDB2_SAVEPOINT_%s') とトランザクションカウンタの値によって決まります。

入れ子状のトランザクションを最初にオープンした後で MDB2 インスタンスが予期せぬ PEAR エラーを発生させた場合は、 トランザクションがロールバックされます。それ以外の場合はこの場所でコミットされます。 getNestedTransactionError() メソッドを使用すると、トランザクション内でエラーが発生したかどうかを調べることができます。 あるいは、 failNestedTransaction() で強制的にロールバックさせることも可能です。 このメソッドはオプションのパラメータを指定することができます。これは getNestedTransactionError() メソッドがコールされた際に返されるエラーとなります。 また二番目の boolean のパラメータとして強制的にロールバックさせるかどうかを指定します。

最後に、MDB2 は SQL 92 標準にしたがったトランザクション分離レベルの設定を サポートしています。この設定には setTransactionIsolation() メソッドを使用します。 使用している RDBMS がその分離レベルをサポートしていないが、 より厳しい分離レベルをサポートしているという場合は、MDB2 は黙ってその厳しい分離レベルを使用します。 いくつかの RDBMS では追加のオプションをサポートしていますが、 MDB2 でサポートしていないものについては黙って無視されます。

準備と実行 (Previous) (Next) モジュール

Download Documentation Last updated: Sun, 05 Oct 2008
Do you think that something on this page is wrong? Please file a bug report or add a note.
User Notes:
Note by: lsmith
In order for the MySQL driver to realize if transactions are enabled, one needs to call connect() explicitly on the MDB2 connection object. Do note the two options "use_transactions" and "default_table_type" in this context. At any rate MDB2 will not know with what table handler the tables were created, so make sure that transactions are only used on transaction aware table handlers as MySQL will silently ignore transactions for non transaction enabled table handlers