アプリケーション開発の手引き

並行トランザクション

アプリケーションが、並行トランザクション と呼ぶ複数の独立した接続を持っていると便利である場合がしばしばあります。トランザクションを使用すると、アプリケーションは一度に複数のデータベースに接続でき、また同じデータベースへの複数の独立した接続を確立することもできます。

マルチスレッドのデータベースのアクセスに説明されている文脈 API を組み込むと、アプリケーションで並行トランザクションを使用することができます。アプリケーション内で作成される文脈は、それぞれ他の文脈とは独立しています。ということは、他の文脈によって実行される COMMIT または ROLLBACK ステートメントなどの活動に影響されずに、新たに文脈を作成し、その文脈を使用してデータベースに接続し、データベースに SQL ステートメントを実行できるということです。

たとえば、ユーザーがあるデータベースに対して SQL ステートメントを実行し、同時に別のデータベースで実行している活動のログを保存するというアプリケーションを作成するとしましょう。ログは最新のものでなければなりませんから、ログを更新するたびに COMMIT ステートメントを発行することが必要ですが、ログに対して発行したコミットがユーザーの SQL ステートメントに影響することのないようにしたいと思います。このようなときにこそ、並行トランザクションを使います。アプリケーション内で、次の 2 つの文脈を作成します。 1 つの文脈はユーザーのデータベースに接続し、ユーザーの SQL すべてに対して使用するもので、別の文脈はログ・データベースに接続し、ログの更新に使用します。このように設計することにより、ログ・データベースへの変更をコミットしても、ユーザーの現在の作業単位には影響は及びません。

並行トランザクションのもう 1 つの利点は、ある接続でカーソルに対する処理がロールバックされても、他の接続のカーソルには何の影響もないということです。 1 つの接続でロールバックが行われた後も、他の接続では終了した処理とカーソル位置はそのまま保持されます。

並行トランザクションを使用する際に気を付けるべき落とし穴

並行トランザクションを使用するアプリケーションでは、単一接続を使用するアプリケーションを作成する場合には起こりえない問題にいくつか直面することがあります。並行トランザクションを用いたアプリケーションを作成する場合には、以下の注意が必要です。

並行トランザクションのデッドロックの回避

データベース・マネージャーは文脈間のデッドロックを検出できないため、デッドロックしないように (または少なくともデッドロックを回避できるように) アプリケーションを設計してコーディングしなければなりません。上の例では、いくつかの方法でデッドロックを回避することができます。

デッドロックを回避する技法を上記の例を参考にして示しましたが、この方法は並行トランザクションを使用するすべてのアプリケーションに適用できます。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]