5.1.2 Java OTSについて
この項では,Java OTSが分散トランザクションを管理する方法を説明します。
一般的なJavaのインプリメンテーションの例を次の図に示します。この例には三つの分散アプリケーションがあり,そのうち二つはJavaで,一つはC++です。C++アプリケーションはデータベース(DB)に接続しています。トランザクションコンテキストサーバおよび決着デーモンはOTS環境が提供します。
関連オブジェクトはすべて,TPBrokerによってそのACID特性を保証されます。
図5-2には一つの共用メモリ領域が示されていますが,各アプリケーションプログラムが異なるマシンにある場合は,共用メモリも別々となります。アプリケーションプログラムが共用メモリ領域を共用する必要はありません。
図5-2の例では,JavaアプリケーションAはJavaアプリケーションBを呼び出し,次にC++アプリケーションCを呼び出します。そして,C++アプリケーションCはデータベースを更新します。すべてのオペレーションは間接コンテキスト管理(Currentインタフェースを使用)と暗黙的プロパゲーションを使用します。この処理の流れの詳細を,次に示します。
- 〈この項の構成〉
(1) トランザクションの開始
トランザクションの開始を次の図に示します。
JavaアプリケーションAはトランザクションを開始します。Java OTSはClientProxyオブジェクトを作成します。これには,新しいトランザクションを作成するトランザクションコンテキストサーバが必要です。トランザクションコンテキストサーバは,共用メモリ内に新しいトランザクションコンテキストを作成します。
(2) Javaアプリケーションへのトランザクションのプロパゲーション
Javaアプリケーションの呼び出しとトランザクションのプロパゲーションを次の図に示します。
JavaアプリケーションAはJavaアプリケーションBへトランザクションをプロパゲーションします。ClientProxyオブジェクトはオブジェクト呼び出しを検出し,トランザクションコンテキストサーバからプロパゲーションコンテキストを取得し,それをトランザクションリクエストに付加します。
(3) ブランチトランザクションの開始
ブランチトランザクションの開始を次の図に示します。
JavaアプリケーションBは,プロパゲーションコンテキストを受け取り,図5-4で示したプロパゲーションコンテキストと同じプロパゲーションコンテキストをトランザクションコンテキストサーバに渡します。そして,トランザクションコンテキストサーバはJavaアプリケーションB用にブランチトランザクションコンテキスト(トランザクションコンテキストB)を作成します。
(4) C++アプリケーションへのトランザクションのプロパゲーション
C++アプリケーションへのトランザクションのプロパゲーションを次の図に示します。
JavaアプリケーションBは,プロパゲーションコンテキストをC++アプリケーションCに渡すことによって,C++アプリケーションCを呼び出します。ServerProxyオブジェクトはオブジェクト呼び出しを検出し,トランザクションコンテキストサーバからプロパゲーションコンテキストを取得し,それをC++アプリケーションCに渡します。
(5) データベースの更新
データベースの更新を次の図に示します。
C++アプリケーションCは,プロパゲーションコンテキストを受け取り,自動的にブランチトランザクションコンテキスト(トランザクションコンテキストC)を作成します。そして,C++アプリケーションCはXAインタフェースを介して,そのデータベースを更新します。
(6) アプリケーションプログラムへのオペレーションの返送
アプリケーションプログラムへのオペレーションの返送を次の図に示します。図中の番号は通信の行われる順序です。
応答はJavaアプリケーションAに戻されます。返送時に,Java OTSはJavaアプリケーションB上のServerProxyオブジェクトを削除します。ServerProxyオブジェクトが削除されると,トランザクションコンテキストサーバは,トランザクションを決着させる責任を持ちます。JavaアプリケーションA上のClientProxyオブジェクトは,JavaアプリケーションBから応答を受けたことをトランザクションコンテキストサーバに知らせます。
(7) トランザクションのコミット
トランザクションのコミットを次の図に示します。
ClientProxyオブジェクトを使用して,JavaアプリケーションAはトランザクションコンテキストサーバにトランザクションをコミットするよう伝えます。トランザクションコンテキストサーバは,2相コミット手順でトランザクションを決着させます。
つまり,トランザクションコンテキストサーバが,データベースのコミットおよびトランザクションコンテキストCの削除のために決着デーモンを起動します。また,トランザクションコンテキストサーバがトランザクションコンテキストAおよびBを削除します。