目次 前 次 PDF


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

CORBAサーバー・アプリケーションのトランザクション
このトピックには次の項が含まれます:
ここでは、トランザクションをOracle Tuxedoサーバー・アプリケーションに統合する方法について説明します。始める前に、第1章「トランザクションの紹介」を読む必要があります。
注意:
Oracle Tuxedo CORBA JavaクライアントとOracle Tuxedo CORBA JavaクライアントORBはTuxedo 8.1で非推奨になり、サポートされなくなりました。すべてのOracle Tuxedo CORBA JavaクライアントおよびOracle Tuxedo CORBA JavaクライアントORBのテキスト・リファレンスとコード・サンプルは、サード・パーティ製のJava ORBライブラリを実装または実行する際の参考や、プログラマの参照用としてのみ使用してください。
サード・パーティのCORBA Java ORBのテクニカル・サポートは、各ベンダーによって提供されます。Oracle Tuxedoでは、サード・パーティのCORBA Java ORBに関する技術的なサポートまたはドキュメントは提供していません。
Oracle Tuxedoクライアントおよびサーバー・アプリケーションのトランザクションの統合
このトピックには次の項が含まれます:
CORBAアプリケーションのトランザクション・サポート
Oracle Tuxedoは、次の方法でトランザクションをサポートします。
クライアント・アプリケーションまたはサーバー・アプリケーションは、TransactionCurrentオブジェクトに対して呼出しを実行することで、トランザクションを明示的に開始および終了できます。TransactionCurrentオブジェクトの詳細は、第4章「CORBAクライアント・アプリケーションのトランザクション」を参照してください。
オブジェクトのインタフェースにトランザクション・ポリシーを割り当てることができます。そうすることで、オブジェクトが呼び出されたときに、トランザクションがすでに開始されていなければ、Oracle Tuxedoシステムがオブジェクトのために自動的にトランザクションを開始し、メソッド呼出しが完了したときにトランザクションをコミットまたはロールバックできるようになります。すべてのトランザクションのコミット権限およびロールバック権限をXAリソース・マネージャに委任する場合は、そのXAリソース・マネージャおよびデータベースも考慮に入れて、オブジェクトのトランザクション・ポリシーを使用します。
トランザクションに関係しているオブジェクトは、トランザクションを強制的にロールバックできます。つまり、トランザクションのスコープ内でオブジェクトが呼び出されると、オブジェクトは、TransactionCurrentオブジェクトのrollback_only()を呼び出して、トランザクションをrollback onlyとマークします。これによって、現在のトランザクションがコミットされるのを防ぐことができます。エンティティ(通常はデータベース)が破損データまたは不正確なデータで更新される危険がある場合、オブジェクトは、トランザクションをrollbackとマークすることが必要な場合があります。
トランザクションに関係するオブジェクトは、最初に呼び出されたときから、トランザクションをコミットまたはロールバックする準備ができたときまでメモリーに保持できます。間もなくコミットされるトランザクションの場合、これらのオブジェクトは、リソース・マネージャがこのトランザクションのコミットを準備する直前にOracle Tuxedoシステムによってポーリングされます。ここでは、ポーリングとはオブジェクトのTobj_ServantBase::deactivate_object()操作を呼び出してreason値を渡すことを意味します。
オブジェクトは、ポーリング時にTransactionCurrentオブジェクトのrollback_only()を呼び出すと、現在のトランザクションを拒否できます。さらに、現在のトランザクションがロールバックされる場合、オブジェクトは、データベースへの書込みをスキップできます。現在のトランザクションを拒否するオブジェクトがない場合、トランザクションはコミットされます。
次の項では、オブジェクトのアクティブ化ポリシーおよびトランザクション・ポリシーを使用し、オブジェクト内でどのように目的のトランザクションの振る舞いを決定するかを説明します。これらのポリシーは、インタフェースに適用されます。したがって、そのインタフェースを実装しているすべてのオペレーションとオブジェクトに適用されます。
注意:
サーバー・アプリケーションが、トランザクションに参加するオブジェクトを管理している場合、そのアプリケーションのServerオブジェクトは、TP::open_xa_rm()オペレーションおよびTP::close_xa_rm()オペレーションを呼び出す必要があります。データベース接続の詳細は、3-7ページの「XAリソース・マネージャのオープン」を参照してください。
オブジェクトを自動的にトランザクションに関与させる方法
Oracle Tuxedoシステムは、alwaysトランザクション・ポリシーを提供します。これは、オブジェクトが呼び出されたときにトランザクションがまだスコープ指定されていない場合、Oracle Tuxedoシステムがトランザクションを自動的に開始するように、そのオブジェクトのインタフェースを定義します。そのオブジェクトの呼出しが完了すると、Oracle Tuxedoシステムは、自動的にトランザクションをコミットまたはロールバックします。サーバー・アプリケーションもオブジェクト実装も、この状態でTransactionCurrentオブジェクトを呼び出す必要はありません。つまり、Oracle Tuxedoシステムは、サーバー・アプリケーションのかわりに自動的にTransactionCurrentオブジェクトを呼び出します。
次のような場合に、alwaysトランザクション・ポリシーをオブジェクトのインタフェースに割り当てます。
オブジェクトがデータベースに書込みをし、このオブジェクトが呼び出されたときに、すべてのデータベースのコミットまたはロールバックの権限をXAリソース・マネージャに委任する必要がある場合。
クライアント・アプリケーションが、複数のオブジェクトに対して呼出しを実行する大規模なトランザクションでオブジェクトを含めることができるようにし、呼出しがすべて成功するか、呼出しが失敗した場合にロールバックする必要がある場合。
オブジェクトを自動的にトランザクションに関係させる必要がある場合、実装構成ファイルで、そのオブジェクトのインタフェースに次のポリシーを割り当てます。
 
アクティブ化ポリシー
トランザクション・ポリシー
process
method
transaction
always
注意:
データベース・カーソルは、複数のトランザクションにまたがることができません。ただし、C++では、Oracle Tuxedo Universityサンプル・アプリケーションのCourseSynopsisEnumeratorオブジェクトは、データベース・カーソルを使用して、Universityデータベースからコースの概要に一致するものを検索します。データベース・カーソルは、複数のトランザクションにまたがることはできないので、CourseSynopsisEnumeratorオブジェクトのactivate_object()操作は、一致したすべてのコースの講義をメモリーに読み取ります。カーソルは、イテレータ・クラスによって管理されるので、CourseSynopsisEnumeratorオブジェクトでは認識できません。
オブジェクトのトランザクションへの参加の有効化
オブジェクトをトランザクションのスコープ内で呼び出せるようにする必要がある場合、optionalトランザクション・ポリシーをそのオブジェクトのインタフェースに割り当てることができます。optionalトランザクション・ポリシーは、データベース書込み操作は実行しないが、トランザクション時の呼出しを可能にする必要があるオブジェクトに適しています。
次のポリシーを、そのオブジェクトのインタフェースに対して実装構成ファイルで指定し、オブジェクトを必要に応じてトランザクションに関係させることができます。
 
アクティブ化ポリシー
トランザクション・ポリシー
process
method
transaction
optional
トランザクション・ポリシーがoptionalのときに、アプリケーションのUBBCONFIGファイルでAUTOTRANパラメータが有効になっている場合、実装はトランザクションに関係します。トランザクションに関係するオブジェクトを含むサーバーは、XA準拠のリソース・マネージャに関連付けられているグループ内で設定する必要があります。
オブジェクトがデータベースのwrite文を実行せず、かつオブジェクトをトランザクションに関与できるようにする場合、alwaysトランザクション・ポリシーを割り当てる方法が、一般的には最良の選択です。ただし、好みに合せて、optionalポリシーを使用して、TransactionCurrentオブジェクトでの呼出しでwrite文をカプセル化できます。つまり、オブジェクトがまだトランザクション内にスコープ指定されていない場合、データを書き込むオペレーション内で、トランザクションを開始およびコミットまたはロールバックするためにTransactionCurrentオブジェクトを呼び出し、write文の周囲にトランザクションをスコープします。これによって、データベース書込みオペレーションがトランザクションに関与する形で処理されます。また、パフォーマンスも効率的に発揮できるようになります。オブジェクトがトランザクションのスコープ内で呼び出されなかった場合、すべてのデータベース読取りオペレーションは、トランザクションに関与しないため、より効率的になります。
注意:
トランザクション・ポリシーを選択してオブジェクトに割り当てる場合、使用しているXAリソース・マネージャの要件を把握します。たとえば、XAリソース・マネージャ(Oracle 7トランザクション・マネージャ・サーバーなど)では、トランザクションに参加するオブジェクトが、データベース書込みオペレーションだけでなく、読取りオペレーションもトランザクション内でスコープ指定する必要があります(ただし、自身のトランザクションをスコープ指定することはできます)。他のリソース・マネージャ(Oracle8iなど)では、読取りオペレーションおよび書込みオペレーションのトランザクション・コンテキストを必要としません。アプリケーションが、トランザクション・コンテキストなしに書込みオペレーションを実行しようとすると、Oracle8iは、アプリケーションがローカル・トランザクションを明示的にコミットする必要がある場合に、暗黙的にローカル・トランザクションを開始します。
トランザクションのスコープ指定時のオブジェクト呼出しの防止
多くの場合、オブジェクトをトランザクションから除外することは危険です。このようなオブジェクトがトランザクション時に呼び出されると、オブジェクトは例外を返し、トランザクションがロールバックされることがあります。Oracle Tuxedo CORBAにはneverトランザクション・ポリシーが用意されていて、これをオブジェクトのインタフェースに割り当てれば、現在のトランザクションが一時停止中でも、特定のオブジェクトがトランザクションの処理中に呼び出されないようにできます。
このトランザクション・ポリシーは、XAリソース・マネージャによって管理されないディスクにデータを書き込むオブジェクトなど、ロールバックできない永続的な状態をディスクに書き込むオブジェクトに適しています。クライアント・アプリケーションで、呼出しの一部がトランザクションのスコープ指定を引き起こしているかどうかを認識できない場合、クライアント/サーバー・アプリケーションでこの機能を使用することは重要です。したがって、トランザクションがスコープ指定されている場合、このポリシーを持つオブジェクトが呼び出されると、トランザクションをロールバックできるようになります。
トランザクションがスコープ指定されているときにオブジェクトの呼出しを防ぐには、実装構成ファイルで、そのオブジェクトのインタフェースに次のポリシーを割り当てます。
 
アクティブ化ポリシー
トランザクション・ポリシー
process
method
never
実行中のトランザクションからのオブジェクトの除外
トランザクションの過程でのオブジェクトの呼出しは許可するが、そのオブジェクトをトランザクションの一部にはしないことがふさわしい場合もあります。このようなオブジェクトがトランザクションの最中に呼び出された場合、トランザクションは自動的に一時停止します。オブジェクトに対する呼出しが完了すると、トランザクションは自動的に再開します。この目的のために、Oracle Tuxedo CORBAにはignoreトランザクション・ポリシーが用意されています。
ignoreトランザクション・ポリシーは、通常はデータをディスクに書き込まないファクトリなどのオブジェクトに適している場合があります。ファクトリをトランザクションから除外することで、そのファクトリは、トランザクションの最中でもほかのクライアントの呼出しに使用できるようになります。さらに、このポリシーを使用すると、トランザクションに関与しているオブジェクトを呼び出す際のオーバーヘッドが軽減されるので、サーバー・アプリケーションの処理効率が向上します。
トランザクションがオブジェクトに伝播されないようにするには、実装構成ファイルで、そのオブジェクトのインタフェースに次のポリシーを割り当てます。
 
アクティブ化ポリシー
トランザクション・ポリシー
process
method
ignore
ポリシーの割当て
実装構成ファイルの作成方法とオブジェクトに対するポリシーの指定方法の詳細は、『CORBAプログラミング・リファレンス』の「Oracle Tuxedo CORBAサーバー・アプリケーションの作成手順」、ステップ4: オブジェクトのメモリー内での動作の定義に関する項を参照してください。
XAリソース・マネージャの使用方法
トランザクション・マネージャ・サーバー(TMS)は、オブジェクトの状態データを自動的に処理します。たとえば、drive:\TUX8\samples\corba\university\transactionsディレクトリのUniversityサンプルC++アプリケーションは、リレーショナル・データベース管理サービス(RDBMS)の例としてOracle TMSを使用します。
XAリソース・マネージャを使用すると、サーバー・アプリケーションで管理される別のオブジェクトが、データベースとの間のデータの読み書きをどのように実行するかについて、次のような特定の要件が適用されます。
Oracle7などの一部のXAリソース・マネージャでは、すべてのデータベース・オペレーションをトランザクション内にスコープ指定する必要があります。つまり、DBaccessオブジェクトは、データベースから読取りを実行するので、このオブジェクトに対するすべてのメソッド呼出しをトランザクション内にスコープ指定する必要があります。トランザクションは、クライアントまたはOracle Tuxedoシステムで開始できます。
他のXAリソース・マネージャ(Oracle8iなど)では、読取り操作および書込み操作のトランザクション・コンテキストを必要としません。アプリケーションが、トランザクション・コンテキストなしに書込み操作の実行を試行すると、Oracle8iは、アプリケーションがローカル・トランザクションを明示的にコミットする必要がある場合に、暗黙的にローカル・トランザクションを開始します。
トランザクションをコミットまたはロールバックすると、XAリソース・マネージャは、そのコミットまたはロールバックが示す永続的な状態を自動的に処理します。つまり、トランザクションをコミットすると、XAリソース・マネージャは、すべてのデータベース更新を恒久的なものにします。同様に、トランザクションをロールバックすると、XAリソース・マネージャは、データベースをトランザクション開始前の状態に復元します。
XAリソース・マネージャの特徴は、ロールバック時のオブジェクト状態データの処理に関する設計の問題をより簡単なものにすることです。トランザクションに関与するオブジェクトは、コミットおよびロールバック権限をXAリソース・マネージャに委譲します。これによって、サーバー・アプリケーションの実装は、大幅に単純化されます。
XAリソース・マネージャのオープン
オブジェクトのインタフェースにalwaysまたはoptionalトランザクション・ポリシーが適用されている場合、ServerオブジェクトのServer::initialize()操作のTP::open_xa_rm()操作を呼び出す必要があります。リソース・マネージャは、UBBCONFIGファイルのGROUPSセクションにあるOPENINFOパラメータで提供された情報を基にオープンされます。デフォルト・バージョンのServer::initialize()操作では、自動的にリソース・マネージャがオープンされます。
データをディスクに書き込まず、トランザクションに参加しているオブジェクト(通常、トランザクション・ポリシーはoptional)がある場合、TP::open_xa_rm()オペレーションへの呼出しを含める必要があります。その呼出しでは、NULLリソース・マネージャを指定します。
XAリソース・マネージャのクローズ
ServerオブジェクトのServer::initialize()操作が、XAリソース・マネージャをオープンする場合は、Server::release()操作に次の呼出しを含めます。
TP::close_xa_rm();
トランザクション管理とオブジェクト状態管理
このトピックには次の項が含まれます:
Oracle Tuxedo CORBAクライアントおよびサーバー・アプリケーションでトランザクションが必要な場合、トランザクションをいくつかの方法でオブジェクト状態管理に統合できます。通常、Oracle Tuxedo CORBAは、アプリケーションのロジック、またはオブジェクトが永続状態をディスクに書き込む方法を変更せずに、操作呼出しの間、自動的にトランザクションをスコープ指定できます。
XAリソース・マネージャへのオブジェクト状態管理の委譲
通常、OracleなどのXAリソース・マネージャを使用すると、ロールバック時のオブジェクト状態データの処理に関する設計の問題をより簡単にできます。(Oracleリソース・マネージャは、Oracle Tuxedo CORBA UniversityサンプルC++アプリケーションで使用されます)。トランザクションに関与するオブジェクトは、コミットおよびロールバック権限をXAリソース・マネージャに委譲します。これによって、サーバー・アプリケーションの実装は、大幅に単純化されます。つまり、トランザクションに関与するプロセス・バウンドまたはメソッド・バウンド・オブジェクトは、トランザクション時にデータベースに書込みを実行し、トランザクションのロールバック時にリソース・マネージャに従ってデータベースに書き込まれたデータをロールバックできます。
トランザクションの作業が完了してから、データベースへの書込みが始まるまでの待機
transactionアクティブ化ポリシーは、トランザクションの作業が完了するまで書き込まない、または書き込めないメモリー内の状態をディスクに保持するオブジェクトに適しています。transactionアクティブ化ポリシーをオブジェクトに割り当てると、オブジェクトは、次のようになります。
トランザクションのスコープ内で最初に呼び出されたときに、メモリーに書き込まれます。
トランザクションがコミットされるかロールバックされるまで、メモリー内に残ります。
トランザクションの作業が完了したら、Oracle Tuxedo CORBAは、DR_TRANS_COMMITTINGまたはDR_TRANS_ABORTEDのいずれかの可能性があるreasonコードを渡す、各トランザクション・バウンド・オブジェクトのTobj_ServantBase::deactivate_object()操作を呼び出します。変数がDR_TRANS_COMMITTINGの場合、オブジェクトは、データベース書込み操作を呼び出すことができます。変数がDR_TRANS_ABORTEDの場合、オブジェクトは、データベース書込み操作をスキップします。
transactionアクティブ化ポリシーの割当てが必要な場合
transactionアクティブ化ポリシーのオブジェクトへの割当ては、次のような場合に適しています。
トランザクションが完了したときに、オブジェクトが永続状態をディスクに書き込めるようにする場合。
ロールバックの対象となる可能性のあるデータベース書込みオペレーションの数を減らすことができるので、これによって、パフォーマンスがより効率的になります。
オブジェクトが、間もなくコミットされるトランザクションを拒否できるようにする場合。
Oracle Tuxedo CORBAがreason値としてDR_TRANS_COMMITTINGを渡す場合、オブジェクトは、必要であればTransactionCurrentオブジェクトのrollback_only()を呼び出すことができます。Tobj_ServantBase::deactivate_object()操作の内部でrollback_only()を呼び出した場合、そのdeactivate_object()が再度呼び出されない点に注意してください。
オブジェクトがバッチ更新を実行できるようにする場合。
1つのトランザクションに複数回関与する可能性が高いオブジェクトがあり、そのトランザクション時にオブジェクトを連続してアクティブ化または非アクティブ化する際のオーバーヘッドを避けるようにする場合。
transactionアクティブ化ポリシーで使用するトランザクション・ポリシー
トランザクションがコミットされてからデータベースに書き込まれるまでオブジェクトが待機できるようにするには、実装構成ファイルで、そのオブジェクトのインタフェースに次のポリシーを割り当てます。
 
アクティブ化ポリシー
トランザクション・ポリシー
transaction
alwaysまたはoptional
注意:
トランザクション・バウンド・オブジェクトは、Tobj_ServantBase::deactivate_object()操作内でトランザクションを開始することや、他のオブジェクトを呼び出すことはできません。deactivate_object()内でトランザクション・バウンド・オブジェクトが唯一可能な呼出しは、データベースへの書込み操作です。
また、トランザクションに関与するオブジェクトがある場合、そのオブジェクトを管理するServerオブジェクトは、データをディスクに書き込まない場合でも、XAリソース・マネージャを開く、または閉じるための呼出しを含める必要があります(データをディスクに書き込まない、トランザクションに関与するオブジェクトがある場合は、NULLリソース・マネージャを指定します。)XAリソース・マネージャのオープンとクローズの詳細は、3-7ページの「XAリソース・マネージャのオープン」および3-8ページの「XAリソース・マネージャのクローズ」を参照してください。
ユーザー定義の例外
このトピックには次の項が含まれます:
ユーザー定義の例外について
Oracle Tuxedo CORBAクライアント/サーバー・アプリケーションにユーザー定義の例外を含めるには、次の手順を実行する必要があります。
1.
OMG IDLファイルで、例外を定義し、それを使用できるオペレーションを指定します。
2.
実装ファイルに例外をスローするコードを含めます。
3.
クライアント・アプリケーションのソース・ファイルに、例外を捕捉して処理するコードを含めます。
たとえば、TransactionsサンプルC++アプリケーションは、ユーザー定義の例外TooManyCreditsのインスタンスを含んでいます。クライアント・アプリケーションが学生をコースに登録するときに、学生が登録可能なコースの最大数を超えている場合、サーバー・アプリケーションはこの例外を返します。クライアント・アプリケーションは、この例外を受け取ると、学生をコースに登録するトランザクションをロールバックします。ここでは、サンプルとしてTooManyCredits例外を使用し、Oracle Tuxedo CORBAクライアント/サーバー・アプリケーションでユーザー定義の例外をどのように定義および実装できるかを説明します。
例外の定義
クライアント/サーバー・アプリケーションの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
);
例外のスロー
例外を使用するオペレーションの実装で、次のC++例のように例外をスローするコードを記述します。
if ( ... ) {
UniversityZ::TooManyCredits e;
e.maximum_credits = 18;
throw e;
Transactions Universityサンプル・アプリケーションのしくみ
このトピックには次の項が含まれます:
Transactions Universityサンプル・アプリケーションについて
学生を登録するプロセスを実装するために、Transactionsサンプル・アプリケーションは、次の作業を実行します。
クライアント・アプリケーションは、BootstrapオブジェクトからTransactionCurrentオブジェクトの参照を取得します。
学生が登録希望のコースのリストを提出したときに、クライアント・アプリケーションは次を実行します。
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サンプル・アプリケーションでは、3-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インタフェースに対して次のオブジェクト・ポリシーを指定します。
 
アクティブ化ポリシー
トランザクション・ポリシー
process
always
RegistrarFactoryオブジェクトで定義されたオブジェクト・ポリシー
RegistrarFactoryオブジェクトがトランザクションに関係するようにするために、ICFファイルは、Registrarインタフェースに対してignoreトランザクション・ポリシーを指定します。したがって、Transactionサンプル・アプリケーションでは、ICFファイルで、RegistrarFactoryインタフェースに対して次のオブジェクト・ポリシーを指定します。
 
アクティブ化ポリシー
トランザクション・ポリシー
process
ignore
Transactionsサンプル・アプリケーションでのXAリソース・マネージャの使用
Transactionsサンプル・アプリケーションは、オブジェクト状態データを自動的に処理するOracleトランザクション・マネージャ・サーバー(TMS)を使用します。XAリソース・マネージャを使用すると、サーバー・アプリケーションで管理される別のオブジェクトが、データベースとの間のデータの読み書きをどのように実行するかについて、次のような特定の要件が適用されます。
Oracle7などの一部のXAリソース・マネージャでは、すべてのデータベース・オペレーションをトランザクション内にスコープ指定する必要があります。つまり、CourseSynopsisEnumeratorオブジェクトは、データベースから読取りを実行するので、このオブジェクトをトランザクション内にスコープ指定する必要があります。
トランザクションをコミットまたはロールバックすると、XAリソース・マネージャは、そのコミットまたはロールバックが示す永続的な状態を自動的に処理します。つまり、トランザクションをコミットすると、XAリソース・マネージャは、すべてのデータベース更新を恒久的なものにします。同様に、トランザクションをロールバックすると、XAリソース・マネージャは、データベースをトランザクション開始前の状態に復元します。
XAリソース・マネージャの特徴は、ロールバック時のオブジェクト状態データの処理に関する設計の問題をより簡単なものにすることです。トランザクションに関与するオブジェクトは、コミットおよびロールバック権限をXAリソース・マネージャに委譲します。これによって、サーバー・アプリケーションの実装は、大幅に単純化されます。
Transactionsサンプル・アプリケーションの構成の要件
Universityサンプル・アプリケーションでは、Oracleトランザクション・マネージャ・サーバー(TMS)を使用します。Oracleデータベースを使用するには、Oracleが提供する特定のファイルをサーバー・アプリケーションの構築プロセスで含める必要があります。Transactionサンプル・アプリケーションの構築、構成および実行の詳細は、Oracle Tuxedoオンライン・ドキュメントのTransactionサンプル・アプリケーションに関する項を参照してください。UBBCONFIGファイルの構成可能な設定の詳細は、5-2ページの「UBBCONFIGファイルをトランザクションに対応させて変更する」を参照してください。
 

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