BEA Logo BEA Tuxedo Release 8.0

  BEA ホーム  |  イベント  |  ソリューション  |  パートナ  |  製品  |  サービス  |  ダウンロード  |  ディベロッパ・センタ  |  WebSUPPORT

 

   Tuxedo ホーム   |   CORBA サーバ・アプリケーションの開発方法   |   前へ   |   次へ   |   目次   |   索引

トランザクションの CORBA サーバ・アプリケーションへの統合

 

この章では、CORBA サーバ・アプリケーションにトランザクションを統合する方法について、Transactions University サンプル・アプリケーションを例にして説明します。Transactions サンプル・アプリケーションは、学生がコースのセットを登録するプロセスをカプセル化します。Transactions サンプル・アプリケーションでは、CORBA サーバ・アプリケーションをトランザクションに統合するためのすべての方法ではなく、トランザクションの振る舞いの 2 つのモデルを示すことによって、アプリケーション一般、特にオブジェクトの永続状態に対するトランザクションの振る舞いの影響を示します。

ここでは、以下の内容について説明します。

また、この章ではユーザ定義例外についても説明します。Transactions サンプル・アプリケーションはユーザ定義例外を利用します。この例外は、クライアント・アプリケーションに返すことができ、クライアントが開始したトランザクションのロールバックを発生させることが可能です。

 


BEA Tuxedo システムでのトランザクションの概要

BEA Tuxedo システムでは、データベースのトランザクションが正確に完了すること、およびデータベースのトランザクションが高性能なトランザクションの ACID プロパティ (原子性、一貫性、独立性、および持続性) のすべてを備えることを保証する手段として、トランザクションが提供されています。つまり、永続ストレージに複数の書き込みオペレーションを実行する上での要件があるので、オペレーションの成功が保証されている必要があります。オペレーションが 1 つでも失敗すれば、一連のオペレーションの全体がロールバックされます。

一般に、トランザクションは次のリストで説明される状況に適しています。それぞれの状況は、BEA Tuxedo システムでサポートされているトランザクション・モデルをカプセル化しています。

 


CORBA サーバ・アプリケーションでのトランザクションの設計およびインプリメンテーション

ここでは、CORBA サーバ・アプリケーションでのトランザクションを設計およびインプリメントする方法について、Transactions University サンプル・アプリケーションを例にして説明します。また、ここでは、Transactions サンプル・アプリケーションの動作と、トランザクションをインプリメントする際の設計上の考慮事項についても説明します。トランザクション全般の詳細については、「トランザクションの CORBA クライアントおよびサーバ・アプリケーションへの統合」を参照してください。

Transactions サンプル・アプリケーションは、学生がコースのセットを登録するプロセスを、トランザクションを利用してカプセル化します。このアプリケーションで使用されているトランザクション・モデルは、前の節で説明したように、会話モデルと、単一の呼び出しがデータベースに対して複数のオペレーションを個別に行うモデルを組み合わせたものです。

この Transactions サンプル・アプリケーションは、Security サンプル・アプリケーションを基に以下の機能を追加したものです。

Transactions サンプル・アプリケーションは、トランザクションをロールバックする 2 つの方法を示します。

ここでは、次の内容について説明します。

Transactions University サンプル・アプリケーションのしくみ

学生による登録のプロセスをインプリメントするために、Transactions サンプルアプリケーションでは以下のことが行われます。

Transactions University サンプル・アプリケーションで使用されるトランザクション・モデル

Transactions サンプル・アプリケーションの設計の要点は、コースの登録を一度に 1 つではなくグループにして処理することです。この設計は、Registrar オブジェクトへのリモート呼び出しの数を最小にすることに役立ちます。

この設計のインプリメンテーションで、Transactions サンプル・アプリケーションはトランザクションの使用の 1 モデルを示します。トランザクションの各モデルの詳細については、「BEA Tuxedo システムでのトランザクションの概要」を参照してください。このモデルは、以下のようになります。

University サーバ・アプリケーションのオブジェクト状態の考慮事項

Transactions University サンプル・アプリケーションがトランザクションを扱うので、University サーバ・アプリケーションでは一般にオブジェクト状態への影響を検討する必要があり、特にロールバックの場合を考慮する必要があります。ロールバックが発生する場合、サーバ・アプリケーションは、影響を受けるすべてのオブジェクトの永続状態が適切な状態に復元されることを確認する必要があります。

Registrar オブジェクトがデータベースのトランザクションに使用されるので、このオブジェクトについてはトランザクションに関与させるのが正しい設計上の選択です。つまり、このオブジェクトのインターフェイスに always トランザクション方針を割り当てることです。このオブジェクトが呼び出されたときにトランザクションのスコープ指定がなされていない場合でも、BEA Tuxedo システムはトランザクションを自動的に開始します。

Registrar オブジェクトを自動的にトランザクション・モードになるようにすることで、このオブジェクトによって実行されるすべてのデータベース書き込みオペレーションは、常にトランザクションのスコープ内で行われることになり、クライアント・アプリケーションによってトランザクションが開始されたかどうかは関係がなくなります。サーバ・アプリケーションでは XA リソース・マネージャが使用され、オブジェクトはトランザクション内でデータベースへの書き込みを行うことが保証されているので、このオブジェクトにはロールバックやコミットを扱う必要が一切ありません。これは、XA リソース・マネージャがオブジェクトの代わりにこうしたデータベース・オペレーションを扱うためです。

しかし、RegisterFactory オブジェクトは、トランザクションの過程で使用されるデータを管理しないのでトランザクションから除外してもかまいません。このオブジェクトをトランザクションから除外することで、トランザクションに伴う処理のオーバーヘッドを最小にできます。

Regstrar オブジェクトについて定義されるオブジェクト方針

Registrar オブジェクトをトランザクションに関与するようにするために、ICF ファイルは Registrar インターフェイスに always トランザクション方針を指定します。このため、Transaction サンプル・アプリケーションでは、ICF ファイルによって Registrar インターフェイスに次のオブジェクト方針が指定されます。

活性化方針

トランザクション方針

process

always


 

RegstrarFactory オブジェクトについて定義されるオブジェクト方針

RegistrarFactory オブジェクトをトランザクションから除外するために、ICF ファイルは Registrar インターフェイスに ignore トランザクション方針を指定します。このため、Transaction サンプル・アプリケーションでは、ICF ファイルによって RegistrarFactory インターフェイスに次のオブジェクト方針が指定されます。

活性化方針

トランザクション方針

process

ignore


 

Transactions サンプル・アプリケーションでの XA リソース・マネージャの使用

Transactions サンプル・アプリケーションは、オブジェクト状態のデータを自動的に処理する Oracle トランザクション・マネージャ・サーバ (TMS) を使用します。XA リソース・マネージャを使用することで、サーバ・アプリケーションによって管理されている個々のオブジェクトがデータベースのデータを読み書きする方法について、次のような特定の要件が生じます。

Transactions サンプル・アプリケーションのコンフィギュレーションの要件

University サンプル・アプリケーションは、Oracle のトランザクション・マネージャ・サーバ (TMS) を使用します。Oracle のデータベースを使用するには、サーバ・アプリケーションを構築する際に、Oracle から提供された特定のファイルを含める必要があります。

Transactions サンプル・アプリケーションの構築、設定、および実行の詳細については、『BEA Tuxedo CORBA University サンプル・アプリケーション』を参照してください。また、オンライン・マニュアルにも、各サンプル・アプリケーション用の UBBCONFIG ファイルと、ファイルの各エントリの説明が示されています。

 


トランザクションの CORBA クライアントおよびサーバ・アプリケーションへの統合

BEA Tuxedo システムは、以下のようにしてトランザクションをサポートします。

以後の節では、必要なトランザクションの振る舞いをオブジェクトに指定するためにオブジェクトの活性化方針とトランザクション方針を使用する方法を説明します。これらの方針は、インターフェイスに適用されるので、このインターフェイスをインプリメントするすべてのオブジェクトでのオペレーションにも適用されるという点に注意してください。

注記 トランザクションに参加できるようにする必要があるオブジェクトがサーバ・アプリケーションによって管理されている場合、そのアプリケーションの Server オブジェクトは TP::open_xa_run() および TP::close_xa_rm() オペレーションを呼び出す必要があります。データベース接続の詳細については、「XA リソース・マネージャのオープン」を参照してください。

オブジェクトを自動的にトランザクションに関与させる方法

BEA Tuxedo システムでは always トランザクション方針が提供されています。この方針はオブジェクトのインターフェイスに定義することができ、オブジェクトが呼び出されて、トランザクションがまだスコープ指定されていないときに BEA Tuxedo システムでトランザクションを自動的に開始させることができます。オブジェクトの呼び出しが完了したら、BEA Tuxedo システムは自動的にトランザクションをコミットまたはロールバックします。この状況では、サーバ・アプリケーションまたはオブジェクト インプリメンテーションのどちらも、TransactionCurrent オブジェクトを呼び出す必要がありません。サーバ・アプリケーションの代わりに、BEA Tuxedo システムが自動的に TransactionCurrent オブジェクトを呼び出します。

オブジェクトのインターフェイスに always トランザクション方針を割り当てることが適切なのは、次の場合です。

オブジェクトを自動的にトランザクションに関与させる必要がある場合は、当該のオブジェクトのインターフェイスに関する次の方針をインプリメンテーション・コンフィギュレーション・ファイル (ICF ファイル) に記述します。

活性化方針

トランザクション方針

processmethod、または transaction

always


 

注記 データベース・カーソルは、複数のトランザクションをまたぐことができません。CORBA の University サンプル・アプリケーションにある CourseSynopsisEnumerator オブジェクトでは、一致するコース概要を University データベースで検索するためにデータベース・カーソルが使用されています。データベース・カーソルが複数のトランザクションをまたげないので、CourseSynopsisEnumerator オブジェクトの activate_object() オペレーションは、一致するコース概要をすべてメモリに読み込みます。カーソルはイテレータ・クラスによって管理されているので、CourseSynopsisEnumerator オブジェクトからは見えないことに注意してください。

オブジェクトのトランザクションへの参加の有効化

オブジェクトをトランザクションのスコープ内で呼び出せるようにする必要がある場合は、そのオブジェクトのインターフェイスに optional トランザクション方針を割り当てることができます。optional トランザクション方針が適したオブジェクトは、データベースへの書き込みオペレーションを一切しないものの、トランザクションの間も呼び出し可能にしておく必要があるオブジェクトです。

オブジェクトに optional トランザクション方針を適用するために、そのオブジェクトのインターフェイス用の ICF ファイルで次の方針を指定できます。

活性化方針

トランザクション方針

processmethod、または transaction

optional


 

オブジェクトがデータベースへの書き込みオペレーションを実行するものである場合に、そのオブジェクトをトランザクションに参加させる必要があるならば、always トランザクション方針を割り当てる方が一般にはよりよい選択肢です。しかし、好みに応じて、optional 方針を使用し、TransactionCurrent オブジェクトへの呼び出し内にすべての書き込みオペレーションをカプセル化することも可能です。つまり、トランザクション内での TransactionCurrent オブジェクトのスコープが未指定であれば、データを書き込むオペレーションの内部で、トランザクションの開始時、およびコミットまたはロールバック時にそれぞれ TransactionCurrent オブジェクトを呼び出すことで write 文についてトランザクションのスコープ指定をすることができます。これにより、すべてのデータベース書き込みオペレーションがトランザクションで処理されるようにできます。また、性能も向上します。TransactionCurrent オブジェクトがトランザクションのスコープ内で呼び出されなければ、すべてのデータベース読み取りオペレーションがトランザクションの外部になるので、効率が高くなります。

注記 BEA Tuxedo システムで使用される XA リソース・マネージャの一部では、トランザクションに関与するすべてのオブジェクトについて、データベース書き込みオペレーションに加えて読み取りオペレーションについても、トランザクション内でスコープ指定する必要があります (しかし、それでも独自にトランザクションのスコープ指定はできます)。たとえば、BEA Tuxedo システムで Oracle TMS を使用する場合に、この要件が該当します。使用するオブジェクトに割り当てるトランザクション方針を選択する際は、使用する XA リソース・マネージャの要件を確認してください。

トランザクションのスコープ指定中にオブジェクトが呼び出されるのを防ぐ方法

多くの場合、オブジェクトをトランザクションから除外することが重要になります。除外すべきオブジェクトがトランザクションで呼び出されると、そのオブジェクトが例外を返すことで、トランザクションがロールバックされてしまう可能性があります。BEA Tuxedo システムには never トランザクション方針が用意されていて、これをオブジェクトのインターフェイスに割り当てれば、現在のトランザクションが一時停止中でも、特定のオブジェクトをトランザクションの処理中に呼び出されないようにできます。

このトランザクション方針は、ロールバックできないディスクに永続状態を書き込むオブジェクトに適しています。たとえば、XA リソース・マネージャに管理されていないディスクにデータを書き込むオブジェクトなどです。クライアント/サーバ・アプリケーションがこうした機能 (トランザクション方針) を備えることは、クライアント・アプリケーションの呼び出しでトランザクションがスコープ指定されることをクライアント・アプリケーション自身が知らないか、知ることができない場合に重要です。こうすれば、トランザクションにスコープ指定がされていて、never トランザクション方針が設定されたオブジェクトが呼び出されても、トランザクションのロールバックが可能です。

トランザクションのスコープ指定がされているときにオブジェクトの呼び出しを禁止するには、ICF ファイルで当該のオブジェクトのインターフェイスに次の方針を割り当てます。

活性化方針

トランザクション方針

process または method

never


 

進行中のトランザクションからオブジェクトを除外する方法

場合によっては、トランザクションの処理中にオブジェクトへの呼び出しを許可しながらも、そのオブジェクトをトランザクションの一部にすることは許可しないという方法が適していることがあります。こうしたオブジェクトがトランザクション中に呼び出されると、そのトランザクションは自動的に一時停止されます。オブジェクトへの呼び出しが完了した後で、トランザクションは自動的に再開されます。この目的のために、BEA Tuxedo システムには ignore トランザクション方針が用意されています。

ignore トランザクション方針は、通常はディスクにデータを書き込まないファクトリのようなオブジェクトに適しています。トランザクションからファクトリを除外することで、トランザクションの間もファクトリがほかのクライアント呼び出しから利用可能になります。さらに、この方針を使用すれば、オブジェクトをトランザクションで呼び出すオーバーヘッドが最小になるので、サーバ・アプリケーションの効率が高まります。

トランザクションがオブジェクトに伝達されることを禁止するには、ICF ファイルで当該のオブジェクトのインターフェイスに次の方針を割り当てます。

活性化方針

トランザクション方針

process または method

ignore


 

方針の割り当て

ICF ファイルを作成してオブジェクトに方針を指定する方法の詳細については、「ステップ 4: オブジェクトのメモリ内での振る舞い」を参照してください。

XA リソース・マネージャのオープン

オブジェクトのインターフェイスに always または optional トランザクション方針が割り当てられている場合は、Server オブジェクトの Server::initialize() オペレーションで TP::open_xa_rm() オペレーションを呼び出す必要があります。リソース・マネージャは、UBBCONFIG ファイルの GROUPS セクションにある OPENINFO パラメータで指定されている情報に基づいてオープンされます。Server::initialize() オペレーションのデフォルト・バージョンでは、リソース・マネージャが自動的にオープンされる点に注意してください。

ディスクにデータを書き込まず、トランザクションに参加するオブジェクトがある場合-そのオブジェクトは一般に optional トランザクション方針が割り当てられています-それでも、TP:open_xa_rm() オペレーションへの呼び出しを含める必要があります。こうした呼び出しでは、ヌル・リソース・マネージャを指定してください。

XA リソース・マネージャのクローズ

Server オブジェクトの Server::initialize() オペレーションで XA リソース・マネージャをオープンする場合は、Server::release() オペレーションに次の呼び出しを含める必要があります。

TP::close_xa_rm();

 


トランザクションとオブジェクト状態の管理

CORBA クライアントおよびサーバ・アプリケーションにトランザクションが必要な場合に、トランザクションとオブジェクト状態の管理を統合する方法は複数あります。一般に、BEA Tuxedo システムでは、オペレーション呼び出しの間のトランザクションについてスコープ指定を自動的に行うようにでき、このときにアプリケーションのロジックを変更したり、オブジェクトが永続状態をディスクに書き込む方法を変更したりする必要はありません。

ここでは、トランザクションとオブジェクト状態の管理に関する重要な項目の一部を説明します。

XA リソース・マネージャへのオブジェクト状態管理の委譲

XA リソース・マネージャを使用すると、たとえば CORBA University サンプル・アプリケーションで使用される Oracle のリソース・マネージャなどであれば、一般に、ロールバックでのオブジェクト状態データの処理に関連する設計上の問題が簡単になります。トランザクション・オブジェクトはコミットおよびロールバックの処理をいつでも XA リソース・マネージャに委譲できるので、このことによってサーバ・アプリケーションをインプリメントする作業が大幅に簡略化されます。トランザクションに関係するプロセス・バウンド・オブジェクトやメソッド・バウンド・オブジェクトでもトランザクション中にデータベースへ書き込むことができ、トランザクションがロールバックされる際には、データベースへ書き込まれたすべてのデータを元に戻す処理をリソース・マネージャに任せることができます。

トランザクションの作業が完了してから、データベースへの書き込みが始まるまでの待機

transaction 活性化方針は、トランザクションの処理が完了するまでディスクに書き込みたくない、または書き込めないオブジェクト状態をメモリに保持するのに適した方法です。オブジェクトに transaction 活性化方針を割り当てると、そのオブジェクトは次のように振る舞います。

トランザクションの作業が完了したら、BEA Tuxedo システムは各トランザクション・バウンド・オブジェクトの Tobj_ServantBase::deactivate_object() オペレーションを呼び出して、DR_TRANS_COMMITTING または DR_TRANS_ABORT のどちらかの reason コードを渡します。変数が DR_TRANS_COMITTING であれば、オブジェクトは自身のデータベース書き込みオペレーションを呼び出すことができます。変数が DR_TRANS_ABORT であれば、オブジェクトは自身のデータベース書き込みオペレーションを省略します。

オブジェクトに transaction 活性化方針を割り当てることは、以下の状況において適切です。

トランザクションのコミットを待機してからデータベースに書き込む機能をオブジェクトに付与するには、当該のオブジェクトのインターフェイスに関する次の方針を ICF ファイルに記述します。

活性化方針

トランザクション方針

transaction

always または optional


 

注記 トランザクション・バウンド・オブジェクトは、Tobj_ServantBase::deactivate_object() オペレーションの内部からトランザクションを開始したり、ほかのオブジェクトを呼び出したりすることができません。トランザクション・バウンド・オブジェクトが Tobj_ServantBase::deactivate_object() オペレーションの内部から実行できる唯一の有効な呼び出しは、データベースへの書き込みオペレーションのみです。

また、トランザクションに関与するオブジェクトがある場合、そのオブジェクトを管理する Server オブジェクトは、管理されるオブジェクトがディスクに一切のデータを書き込まない場合でも、XA リソース・マネージャをオープンするための呼び出し、およびクローズするための呼び出しをそれぞれ含んでいる必要があります。ディスクにデータを書き込まないトランザクション・オブジェクトについては、ヌル・リソース・マネージャを指定してください。XA リソース・マネージャをオープンする方法およびクローズする方法の詳細については、「XA リソース・マネージャのオープン」および「XA リソース・マネージャのクローズ」を参照してください。

 


BEA Tuxedo のトランザクションの使用に関する注意事項

CORBA クライアント/サーバ・アプリケーションにトランザクションを統合する際の注意事項は、以下のとおりです。

 


ユーザ定義例外

Transactions サンプル・アプリケーションには、ユーザ定義例外 TooManyCredits のインスタンスが含まれています。この例外は、クライアント・アプリケーションが学生をコースに登録しようとするときに、学生が登録可能なコースの最大数を超えてしまうと、サーバ・アプリケーションによってスローされます。クライアント・アプリケーションでこの例外がキャッチされると、クライアント・アプリケーションは学生をコースに登録するトランザクションをロールバックします。ここでは、CORBA クライアント/サーバ・アプリケーションでユーザ定義例外を定義およびインプリメントする方法について、TooManyCredits を例にして説明します。

CORBA クライアント/サーバ・アプリケーションにユーザ定義例外を含める作業には、次の手順が関与します。

  1. 使用する OMG IDL ファイルで、例外を定義し、例外を使用できるオペレー ションを指定します。

  2. インプリメンテーション・ファイルで、例外をスローするコードを組み込み ます。

  3. クライアント・アプリケーションのソース・ファイルで、例外をキャッチお よび処理するコードを組み込みます。

次の節では、最初の 2 つの手順の説明と例を示します。

例外の定義

クライアント/サーバ・アプリケーションで使用する OMG IDL ファイルで、以下の作業をします。

  1. 例外を定義し、例外と共に送信されるデータを定義します。たとえば TooManyCredits 例外は、学生が履修できる単位の最大数を表す short 型整数 を渡すように定義されています。このため、TooManyCredits 例外の定義に は、次の OMG IDL 文が含まれています。

    exception TooManyCredits
    {
    unsigned short maximum_credits;
    };

  2. 例外をスローするオペレーションの定義に、この例外を含めます。次の例 は、Registrar インターフェイスの register_for_courses() オペレー ション用の OMG IDL 文を示します。

    NotRegisteredList register_for_courses(
    in StudentId student,
    in CourseNumberList courses)
    raises (TooManyCredits);

例外のスロー

例外を使用するオペレーションのインプリメンテーションでは、次の例のように、例外をスローするコードを記述します。

if ( ... ) {
UniversityZ::TooManyCredits e;
e.maximum_credits = 18;
throw e;
}

 

back to top previous page next page