目次 前 次 PDF


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

トランザクションのCORBAサーバー・アプリケーションへの統合
この章では、CORBAサーバー・アプリケーションにトランザクションを統合する方法について、Transactions Universityサンプル・アプリケーションを例にして説明します。Transactionsサンプル・アプリケーションは、学生が一連のコースを登録するプロセスをカプセル化します。Transactionsサンプル・アプリケーションでは、CORBAサーバー・アプリケーションをトランザクションに統合するためのすべての方法ではなく、トランザクションの動作の2つのモデルを示すことによって、アプリケーション一般、特にオブジェクトの永続状態に対するトランザクションの動作の影響を示します。
このトピックには次の項が含まれます:
この章には、ユーザー定義の例外に関する項も含まれます。Transactionsサンプル・アプリケーションはユーザー定義の例外を利用します。この例外は、クライアント・アプリケーションに返すことができ、クライアントが開始したトランザクションのロールバックを発生させることが可能です。
Oracle Tuxedoシステムでのトランザクションの概要
Oracle Tuxedoシステムでは、データベースのトランザクションが正確に完了すること、およびデータベースのトランザクションがパフォーマンスの高いトランザクションのACIDプロパティ(原子性、一貫性、独立性および持続性)のすべてを備えることを保証する手段として、トランザクションが提供されています。つまり、永続ストレージに複数の書込み操作を実行する上での要件があるので、操作の成功が保証されている必要があります。操作が1つでも失敗すれば、一連の操作の全体がロールバックされます。
一般に、トランザクションは次のリストで説明される状況に適しています。それぞれの状況は、Oracle Tuxedoシステムでサポートされているトランザクション・モデルをカプセル化しています。
たとえば、旅行代理店アプリケーションの例を示します。クライアント・アプリケーションは、たとえばフランスのストラスブールからオーストラリアのアリス・スプリングスまでなど、遠隔地への旅行を手配する必要があります。このような旅行では、複数のフライトを予約する必要があります。クライアント・アプリケーションでは、旅程の各区分の予約が順番に行われます。たとえば、ストラスブールからパリ、パリからニューヨーク、ニューヨークからロサンゼルスの予約が順番に行われます。しかし、いずれかのフライトが予約できないとき、クライアント・アプリケーションにはその時点で予約済の他のフライトをすべてキャンセルする方法が必要です。たとえば、クライアント・アプリケーションでロサンゼルスからホノルルへの指定日のフライトを予約できなかったら、クライアント・アプリケーションはその時点までに行ったフライト予約をキャンセルする必要があります。
たとえば、インターネット・ベースのオンライン・ショッピング・アプリケーションの例を示します。クライアント・アプリケーションのユーザーがオンライン・カタログを一覧して、複数の購入を選択します。ユーザーは、購入する商品をすべて選択したら、ボタンをクリックして購入を実行し、クレジット・カード情報を入力します。クレジット・カードの確認が失敗したら(たとえば、ユーザーのクレジット・カード情報が無効だった場合)、ショッピング・アプリケーションでは、未決済の購入選択をすべて取り消したり、会話中に実行されたすべての購入トランザクションをロールバックできる必要があります。
たとえば、銀行取引アプリケーションの例を示します。クライアントは、銀行窓口オブジェクトに対して振替操作を呼び出します。振替操作は、銀行データベースに対して次の呼出しを実行するために銀行窓口オブジェクトを必要とします。
銀行データベースの振替先呼出しに失敗した場合、銀行取引アプリケーションではそれまでの振替元呼出しをロールバックする機能が必要です。
CORBAサーバー・アプリケーションでのトランザクションの設計および実装
ここでは、CORBAサーバー・アプリケーションでのトランザクションを設計および実装する方法について、Transactions Universityサンプル・アプリケーションを例にして説明します。また、ここでは、Transactionsサンプル・アプリケーションの動作、およびTransactionsサンプル・アプリケーションにトランザクションを実装する際の設計上の考慮事項についても説明します。トランザクション全般の詳細は、-9ページの「トランザクションのCORBAクライアントおよびサーバー・アプリケーションへの統合」という項を参照してください。
Transactionsサンプル・アプリケーションはトランザクションを使用して、学生が一連のコースを登録するタスクをカプセル化します。このアプリケーションで使用されているトランザクション・モデルは、前の項で説明したように、会話モデルと、単一の呼出しがデータベースに対して複数の操作を個別に行うモデルを組み合せたものです。
このTransactionsサンプル・アプリケーションは、Securityサンプル・アプリケーションを基に以下の機能を追加したものです。
Transactionsサンプル・アプリケーションは、次の2とおりの方法でトランザクションをロールバックします。
したがって、Transactionsサンプル・アプリケーションでも、ユーザー定義のCORBA例外を実装する方法が示されています。たとえば、学生があるコースを登録すると登録可能な最大コース数を超える場合、そのコースを登録しようとすると、サーバー・アプリケーションはTooManyCredits例外を返します。クライアント・アプリケーションは、この例外を受け取ると、トランザクションを自動的にロールバックします。
ここでは、次の内容について説明します。
Transactions Universityサンプル・アプリケーションのしくみ
学生を登録するプロセスを実装するために、Transactionsサンプル・アプリケーションは、以下の作業を実行します。
a.
TransactionCurrentオブジェクトのCurrent::begin()操作を呼び出して、トランザクションを開始します
b.
Registrarオブジェクトのregister_for_courses()操作を呼び出して、コースのリストを渡します
Registrarオブジェクトのregister_for_courses()操作は、リスト内の各コースに対して、ループ処理で次の作業を繰り返し実行し、登録リクエストを処理します。
a.
b.
Registrarオブジェクトは、トランザクションをコミットできないようにする可能性がある次の問題をチェックします。
アプリケーションのOMG IDLでの定義に従って、register_for_courses()操作は、登録に失敗したコースのリストが含まれているパラメータNotRegisteredListをクライアント・アプリケーションに返します。
NotRegisteredListの値が空の場合、クライアント・アプリケーションはトランザクションをコミットします。
NotRegisteredListの値にコースが含まれている場合、クライアント・アプリケーションは、登録に成功したコースの登録プロセスを完了するかどうかを指定するよう学生に要求します。登録を完了するように選択した場合、クライアント・アプリケーションはトランザクションをコミットします。登録を取り消すように選択した場合、クライアント・アプリケーションはトランザクションをロールバックします。
学生が履修できる単位の最大数を超えているためにコースの登録が失敗した場合、RegistrarオブジェクトはTooManyCredits例外をクライアント・アプリケーションに返し、クライアント・アプリケーションはトランザクション全体をロールバックします。
Transactions Universityサンプル・アプリケーションで使用するトランザクション・モデル
Transactionsサンプル・アプリケーションの基本設計原理は、コース登録を一度に1つではなくグループ単位で処理することです。この設計原理によって、Registrarオブジェクトに対するリモート呼出しの数を最小化できます。
この設計の実装で、Transactionsサンプル・アプリケーションは、6-2ページの「Oracle Tuxedoシステムでのトランザクションの概要」という項で説明しているトランザクションの使用の1つのモデルを示します。このモデルの特徴は、次のとおりです。
クライアントは、TransactionCurrentオブジェクト上でbegin()操作を呼び出してトランザクションを開始し、次にRegistrarオブジェクト上でregister_for_courses()操作を呼び出します。
Registrarオブジェクトは、学生を登録可能なコースに登録し、登録のプロセスに失敗したコースのリストを返します。クライアント・アプリケーションは、トランザクションをコミットするかロールバックするかを選択できます。トランザクションは、クライアント・アプリケーションとサーバー・アプリケーションの間の会話をカプセル化します。
register_for_courses()操作は、Universityデータベースの複数チェックを実行します。いずれか1つのチェックが失敗した場合、トランザクションをロールバックできます。
Universityサーバー・アプリケーションのオブジェクト状態に関する注意事項
Transactions Universityサンプル・アプリケーションはトランザクションに関与するため、Universityサーバー・アプリケーションは通常、オブジェクト状態に関していくつかの点(特にロールバック時の)を考慮する必要があります。ロールバックが発生した場合、サーバー・アプリケーションは、関連するすべてのオブジェクトが、正しい状態に復元された永続状態を持つことを保証する必要があります。
Registrarオブジェクトがデータベースのトランザクションに使用されるため、このオブジェクトについてはトランザクションに関与させることが正しい設計上の選択です。つまり、このオブジェクトのインタフェースにalwaysトランザクション・ポリシーを割り当てることです。オブジェクト呼出し時にトランザクションがまだスコープ指定されていない場合、Oracle Tuxedoシステムは、トランザクションを自動的に開始します。
Registrarオブジェクトが自動的にトランザクションに関与するようにすることで、このオブジェクトによって実行されるすべてのデータベース書込み操作は、クライアント・アプリケーションが開始したかどうかに関係なく、常にトランザクションのスコープ内で完了します。サーバー・アプリケーションはXAリソース・マネージャを使用し、またオブジェクトは、データベースに書込みを実行するときにトランザクションにあることが保証されます。したがって、XAリソース・マネージャがオブジェクトの代わりにロールバックまたはコミットの権限を持つことになるので、オブジェクトにはロールバックまたはコミット権限がありません。
ただし、RegistrarFactoryオブジェクトは、トランザクションの最中に使用するデータを管理しないため、トランザクションから除外できます。オブジェクトをトランザクションから除外することで、トランザクションに課せられる処理のオーバーヘッドを最小化します。
Registrarオブジェクトで定義されたオブジェクト・ポリシー
Registrarオブジェクトがトランザクションに関与するようにするために、ICFファイルは、Registrarインタフェースに対してalwaysトランザクション・ポリシーを指定します。したがって、Transactionサンプル・アプリケーションでは、ICFファイルで、Registrarインタフェースに対して次のオブジェクト・ポリシーを指定します。
 
RegistrarFactoryオブジェクトで定義されたオブジェクト・ポリシー
RegistrarFactoryオブジェクトをトランザクションから除外するために、ICFファイルはRegistrarインタフェースにignoreトランザクション・ポリシーを指定します。したがって、Transactionサンプル・アプリケーションでは、ICFファイルで、RegistrarFactoryインタフェースに対して次のオブジェクト・ポリシーを指定します。
 
Transactionsサンプル・アプリケーションでのXAリソース・マネージャの使用
Transactionsサンプル・アプリケーションは、オブジェクト状態データを自動的に処理するOracleトランザクション・マネージャ・サーバー(TMS)を使用します。XAリソース・マネージャを使用すると、サーバー・アプリケーションで管理される別のオブジェクトが、データベースとの間のデータの読み書きをどのように実行するかについて、次のような特定の要件が適用されます。
一部のXAリソース・マネージャ(たとえば、Oracle)では、すべてのデータベース操作がトランザクションのスコープ内であることが要求されます。これは、CourseSynopsisEnumeratorオブジェクトは、データベースからの読取りを実行するため、トランザクション内にスコープ指定される必要があることを意味します。
XAリソース・マネージャのこの特徴は、実際に、ロールバック時のオブジェクト状態データの処理に関する設計の問題を大幅に簡素化します。トランザクション・オブジェクトは、コミットおよびロールバック権限を常にXAリソース・マネージャに委任でき、このことによってサーバー・アプリケーションを実装するタスクが大幅に簡略化されます。
Transactionsサンプル・アプリケーションの構成の要件
Universityサンプル・アプリケーションは、Oracleのトランザクション・マネージャ・サーバー(TMS)を使用します。Oracleのデータベースを使用するには、Oracleが提供する特定のファイルをサーバー・アプリケーションのビルド・プロセスで含める必要があります。
Transactionsサンプル・アプリケーションのビルド、構成および実行の詳細は、『CORBA Universityサンプル・アプリケーション・ガイド』を参照してください。また、オンライン・ドキュメントにも、各サンプル・アプリケーション用のUBBCONFIGファイルと、ファイルの各エントリの説明が示されています。
トランザクションのCORBAクライアントおよびサーバー・アプリケーションへの統合
Oracle Tuxedoシステムは、次のようにしてトランザクションをサポートします。
トランザクションに関与しているオブジェクトは、トランザクションを強制的にロールバックできます。つまり、トランザクションのスコープ内でオブジェクトが呼び出された後に、そのオブジェクトはTransactionCurrentオブジェクト上でrollback_only()操作を呼び出して、トランザクションをロールバック対象としてマークできます。これによって、現在のトランザクションがコミットされるのを防ぐことができます。エンティティ(通常はデータベース)が破損データまたは不正確なデータで更新される危険がある場合、オブジェクトは、トランザクションをrollbackとしてマークしなければならない場合があります。
オブジェクトは、ポーリング時にTransactionCurrentオブジェクトのrollback_only()操作を呼び出して、現在のトランザクションを拒否できます。さらに、現在のトランザクションがロールバックされる場合、オブジェクトは、データベースへの書込みをスキップできます。現在のトランザクションのコミットを拒否するオブジェクトがなければ、トランザクションはコミットされます。
以降の項では、必要なトランザクションの動作をオブジェクトに指定するためにオブジェクトのアクティブ化ポリシーとトランザクション・ポリシーを使用する方法を説明します。これらのポリシーはインタフェースに適用されるため、そのインタフェースを実装しているすべてのオブジェクトのすべての操作に適用されることに注意してください。
注意:
オブジェクトを自動的にトランザクションに関与させる方法
Oracle Tuxedoシステムは、alwaysトランザクション・ポリシーを提供します。これは、オブジェクトが呼び出されたときにトランザクションがまだスコープ指定されていない場合、Oracle Tuxedoシステムがトランザクションを自動的に開始するように、そのオブジェクトのインタフェースで定義できます。そのオブジェクトの呼出しが完了すると、Oracle Tuxedoシステムは、自動的にトランザクションをコミットまたはロールバックします。サーバー・アプリケーションもオブジェクト実装も、この状態でTransactionCurrentオブジェクトを呼び出す必要はありません。つまり、Oracle Tuxedoシステムは、サーバー・アプリケーションの代わりに自動的にTransactionCurrentオブジェクトを呼び出します。
オブジェクトのインタフェースにalwaysトランザクション・ポリシーを割り当てることが適切な状況は次のとおりです。
オブジェクトを自動的にトランザクションに関与させる必要がある場合は、当該のオブジェクトのインタフェースに関する次のポリシーを実装構成ファイル(ICFファイル)に記述します。
 
processmethodまたはtransaction
注意:
データベース・カーソルは、複数のトランザクションにまたがることができません。CORBAのUniversityサンプル・アプリケーションにあるCourseSynopsisEnumeratorオブジェクトでは、一致するコース概要をUniversityデータベースで検索するためにデータベース・カーソルが使用されています。データベース・カーソルは複数のトランザクションにまたがることができないため、CourseSynopsisEnumeratorオブジェクトに対するactivate_object()操作は一致するすべてのコース概要をメモリーに読み込みます。カーソルはイテレータ・クラスによって管理されているため、CourseSynopsisEnumeratorオブジェクトからは見えないことに注意してください。
オブジェクトのトランザクションへの参加の有効化
オブジェクトをトランザクションのスコープ内で呼び出すことができるようにする必要がある場合、optionalトランザクション・ポリシーをそのオブジェクトのインタフェースに割り当てることができます。optionalトランザクション・ポリシーは、データベース書込み操作を実行しないものの、トランザクション時に呼び出すことができるようにする必要があるオブジェクトに適しています。
オブジェクトにoptionalトランザクション・ポリシーを適用するために、そのオブジェクトのインタフェース用のICFファイルで次のポリシーを指定できます。
 
processmethodまたはtransaction
オブジェクトがデータベースの書込み操作を実行し、かつオブジェクトがトランザクションに関与できるようにする場合、alwaysトランザクション・ポリシーの割当てが、一般的にはより適した選択です。ただし、好みに合せて、optionalポリシーを使用して、TransactionCurrentオブジェクトでの呼出しでwrite文をカプセル化できます。つまり、オブジェクトがまだトランザクション内にスコープ指定されていない場合、データを書き込む操作内で、トランザクションを開始およびコミットまたはロールバックするためにTransactionCurrentオブジェクトを呼び出し、write文の周囲にトランザクションをスコープします。これによって、データベース書込み操作がトランザクションに関与する形で処理されます。また、パフォーマンスも向上します。このオブジェクトがトランザクションのスコープ内で呼び出されなければ、すべてのデータベース読取り操作が非トランザクション型になるので、効率が高くなります。
注意:
トランザクションのスコープ指定時のオブジェクト呼出しの防止
多くの場合、オブジェクトをトランザクションから除外することは危険です。このようなオブジェクトがトランザクション時に呼び出されると、オブジェクトは例外を返し、トランザクションがロールバックされることがあります。Oracle Tuxedoシステムにはneverトランザクション・ポリシーが用意されていて、これをオブジェクトのインタフェースに割り当てれば、現在のトランザクションが一時停止中でも、そのオブジェクトがトランザクションの処理中に呼び出されないようにできます。
このトランザクション・ポリシーは、ロールバックできないディスクに永続状態を書き込むオブジェクトに適しています。たとえば、XAリソース・マネージャに管理されていないディスクにデータを書き込むオブジェクトなどです。クライアント・アプリケーションで、呼出しの一部がトランザクションのスコープ指定を引き起こしているかどうかを認識できない場合、クライアント/サーバー・アプリケーションでこの機能を使用することは重要です。したがって、トランザクションがスコープ指定されている場合、このポリシーを持つオブジェクトが呼び出されると、トランザクションをロールバックできるようになります。
トランザクションがスコープ指定されているときにオブジェクトの呼出しを禁止するには、ICFファイルで当該のオブジェクトのインタフェースに次のポリシーを割り当てます。
 
processまたはmethod
実行中のトランザクションからのオブジェクトの除外
オブジェクトがトランザクションの処理中に呼び出されることを許可するが、そのオブジェクトをそのトランザクションの一部にはしないことが適切な場合もあります。このようなオブジェクトがトランザクション時に呼び出された場合、トランザクションは自動的に一時停止します。オブジェクトに対する呼出しが完了すると、トランザクションは自動的に再開します。この目的のために、Oracle Tuxedoシステムにはignoreトランザクション・ポリシーが用意されています。
ignoreトランザクション・ポリシーは、通常はデータをディスクに書き込まないファクトリなどのオブジェクトに適している場合があります。ファクトリをトランザクションから除外することで、そのファクトリは、トランザクションの最中でもほかのクライアントの呼出しに使用できるようになります。さらに、このポリシーを使用すると、トランザクションに関与しているオブジェクトを呼び出す際のオーバーヘッドが軽減されるので、サーバー・アプリケーションの処理効率が向上します。
トランザクションがオブジェクトに伝播されることを禁止するには、ICFファイルで当該のオブジェクトのインタフェースに次のポリシーを割り当てます。
 
processまたはmethod
ポリシーの割当て
ICFファイルを作成してオブジェクトにポリシーを指定する方法の詳細は、2-13ページの「ステップ4: メモリー内でのオブジェクトの振る舞いの定義」という項を参照してください。
XAリソース・マネージャのオープン
オブジェクトのインタフェースにalwaysまたはoptionalトランザクション・ポリシーが適用されている場合は、サーバー・オブジェクトのServer::initialize()操作のTP::open_xa_rm()操作を呼び出す必要があります。リソース・マネージャは、UBBCONFIGファイルのGROUPSセクションにあるOPENINFOパラメータで提供された情報を基にオープンされます。デフォルト・バージョンのServer::initialize()操作は、リソース・マネージャを自動的にオープンします。
データをディスクに書き込まず、トランザクションに参加しているオブジェクト(通常、トランザクション・ポリシーはoptional)がある場合、TP::open_xa_rm()操作への呼出しを含める必要があります。その呼出しでは、NULLリソース・マネージャを指定します。
XAリソース・マネージャのクローズ
サーバー・オブジェクトのServer::initialize()操作がXAリソース・マネージャをオープンする場合は、Server::release()操作に次の呼出しを含める必要があります。
TP::close_xa_rm();
トランザクション管理とオブジェクト状態管理
CORBAクライアントおよびサーバー・アプリケーションにトランザクションが必要な場合、トランザクションとオブジェクト状態管理をいくつかの異なる方法で統合できます。通常、Oracle Tuxedoシステムでは、アプリケーションのロジック、またはオブジェクトが永続状態をディスクに書き込む方法を変更せずに、操作呼出しの間、自動的にトランザクションをスコープ指定できます。
ここでは、トランザクションとオブジェクト状態の管理に関する重要な項目の一部を説明します。
XAリソース・マネージャへのオブジェクト状態管理の委任
XAリソース・マネージャ(CORBA Universityサンプル・アプリケーションで使用されるOracleのリソース・マネージャなど)を使用すると、一般に、ロールバックでのオブジェクト状態データの処理に関連する設計上の問題が簡単になります。トランザクション・オブジェクトはコミットおよびロールバック権限をいつでもXAリソース・マネージャに委任でき、これによってサーバー・アプリケーションを実装するタスクが大幅に簡略化されます。トランザクションに関係するプロセス・バウンド・オブジェクトやメソッド・バウンド・オブジェクトでもトランザクション中にデータベースへ書き込むことができ、トランザクションのロールバック時には、データベースに書き込まれたすべてのデータを元に戻す処理をリソース・マネージャに任せることができます。
トランザクションの作業が完了してから、データベースへの書込みが始まるまでの待機
transactionアクティブ化ポリシーは、トランザクションの作業が完了するまで書き込まない、または書き込めないメモリー内の状態をディスクに保持するオブジェクトに適しています。transactionアクティブ化ポリシーをオブジェクトに割り当てると、オブジェクトは、次のようになります。
トランザクションの作業が完了したら、Oracle Tuxedoシステムは各トランザクション・バウンド・オブジェクトのTobj_ServantBase::deactivate_object()操作を呼び出して、DR_TRANS_COMMITTINGまたはDR_TRANS_ABORTのどちらかのreasonコードを渡します。変数がDR_TRANS_COMMITTINGの場合、オブジェクトは、データベース書込み操作を呼び出すことができます。変数がDR_TRANS_ABORTであれば、オブジェクトは自身のデータベース書込み操作を省略します。
transactionアクティブ化ポリシーのオブジェクトへの割当ては、次のような場合に適しています。
ロールバックの対象となる可能性のあるデータベース書込み操作の数を減らすことができるので、これによって、パフォーマンスがより効率的になります。
Oracle Tuxedoシステムがreason値としてDR_TRANS_COMMITTINGを渡す場合、オブジェクトは、必要であればTransactionCurrentオブジェクトのrollback_only()操作を呼び出すことができます。Tobj_ServantBase::deactivate_object()操作の内部でrollback_only()操作を呼び出した場合、そのTobj_ServantBase::deactivate_object()操作が再度呼び出される点に注意してください。
トランザクションのコミットを待機してからデータベースに書き込む機能をオブジェクトに付与するには、ICFファイルに当該のオブジェクトのインタフェースに次のポリシーを割り当てます。
 
alwaysまたはoptional
注意:
トランザクション・バウンド・オブジェクトは、Tobj_ServantBase::deactivate_object()操作内でトランザクションを開始したり、他のオブジェクトを呼び出したりすることはできません。トランザクション・バウンド・オブジェクトがTobj_ServantBase::deactivate_object()操作の内部から実行できる有効な呼出しは、データベースへの書込み操作のみです。
また、トランザクションに関与するオブジェクトがある場合、そのオブジェクトを管理するサーバー・オブジェクトは、管理対象のオブジェクトがディスクにデータを書き込まない場合でも、XAリソース・マネージャをオープンするための呼出し、およびクローズするための呼出しをそれぞれ含んでいる必要があります。(データをディスクに書き込まないトランザクション・オブジェクトがある場合は、NULLリソース・マネージャを指定します。) XAリソース・マネージャのオープンとクローズの詳細は、6-13ページの「XAリソース・マネージャのオープン」および6-13ページの「XAリソース・マネージャのクローズ」という項を参照してください。
Oracle Tuxedoのトランザクションの使用に関する注意事項
CORBAクライアント/サーバー・アプリケーションにトランザクションを統合する際の注意事項は、以下のとおりです。
既存のトランザクションがすでにアクティブ化されている場合は、新しいトランザクションを開始できません。既存のトランザクションを中断した後に、新しいトランザクションを開始できます。しかし、中断したトランザクションは、トランザクションを中断したオブジェクトのみが後で再開できます。
トランザクション・オブジェクトは、自身を呼び出すようなオブジェクトを呼び出せません。
CORBA::OBJ_ADAPTER
トランザクション内にあるクライアントが、現在別のトランザクション内にあるオブジェクトに対して操作を呼び出そうとすると、以下のエラー・メッセージが発行されます。
CORBA::INVALID_TRANSACTION
トランザクション・バウンド・オブジェクトについては、すべての状態の処理をTobj_ServantBase::deactivate_object()操作で実行することを検討してください。これにより、Tobj_ServantBase::deactivate_object()操作が呼び出された時点でトランザクションの結果が分かるため、オブジェクトが自身の状態を適切に扱うことが簡単になります。
トランザクション・ポリシーとしてoptionalを割り当てます。
オブジェクトがトランザクションの外部で呼び出された場合、データの読取りに対するトランザクションのスコープにオーバーヘッドは生じません。このようにして、オブジェクトがトランザクション内で呼び出されるかどうかに関係なく、オブジェクトのすべての書込み操作は、トランザクションに関与する形で処理されます。
トランザクション・ポリシーとしてalwaysを割り当てたオブジェクトが、クライアント・アプリケーションではなくOracle Tuxedoシステムで開始されたトランザクションに関与している場合は、次に注意してください。
オブジェクトの操作の内部で例外が発生した場合、クライアント・アプリケーションはOBJ_ADAPTER例外を受け取ります。この状況で、Oracle Tuxedoシステムは自動的にトランザクションをロールバックします。ただし、クライアント・アプリケーションは、トランザクションがOracle Tuxedoドメインでスコープ指定されていないことをまったく認識していません。
注意:
TP::deactivateEnableメソッドを持つトランザクション・オブジェクトに関する次の制限に注意してください。
トランザクション中にTP::deactivateEnableメソッドが呼び出された場合、オブジェクトはトランザクションの終了時に非アクティブ化されます。しかし、TP::deactivateEnableメソッドが呼び出された時点とトランザクションがコミットされた時点の間に、オブジェクトで何らかのメソッドが呼び出された場合、そのオブジェクトは決して非アクティブ化されません。
ユーザー定義の例外
Transactionsサンプル・アプリケーションには、ユーザー定義の例外TooManyCreditsのインスタンスが含まれています。クライアント・アプリケーションが学生をコースに登録しようとしたときに、学生が登録可能なコースの最大数を超えている場合、サーバー・アプリケーションはこの例外をスローします。クライアント・アプリケーションは、この例外を捕捉すると、学生をコースに登録するトランザクションをロールバックします。ここでは、CORBAクライアント/サーバー・アプリケーションでユーザー定義例外を定義および実装する方法について、TooManyCreditsを例にして説明します。
CORBAクライアント/サーバー・アプリケーションにユーザー定義例外を含める作業には、次の手順が関与します。
1.
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;
}
 

Copyright ©1994, 2017,Oracle and/or its affiliates. All rights reserved