CORBAトランザクションの使用

     前  次    新規ウィンドウで目次を開く  新規ウィンドウで索引を開く  PDFとして表示 - 新規ウィンドウ  Adobe Readerを取得 - 新規ウィンドウ
コンテンツはここから始まります

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

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

ここでは、トランザクションをOracle Tuxedoサーバー・アプリケーションに統合する方法について説明します。 始める前に、「トランザクションについて」を読む必要があります。

注意: 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は、次の方法でトランザクションをサポートします。

以下の項では、オブジェクトのアクティブ化ポリシーおよびトランザクション・ポリシーを使用し、オブジェクト内でどのように目的のトランザクションの振る舞いを決定するかを説明します。これらのポリシーは、インタフェースに適用されます。したがって、そのインタフェースを実装しているすべてのオペレーションとオブジェクトに適用されます。

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

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

Oracle Tuxedoシステムにはalwaysトランザクション・ポリシーが用意されており、オブジェクトが呼び出されたときにトランザクションがまだスコープ指定されていない場合、Oracle Tuxedoシステムがトランザクションを自動的に開始するように、そのオブジェクトのインタフェースを定義できます。そのオブジェクトの呼出しが完了すると、Oracle Tuxedoシステムは、自動的にトランザクションをコミットまたはロールバックします。サーバー・アプリケーションもオブジェクト実装も、この状態でTransactionCurrentオブジェクトを呼び出す必要はありません。つまり、Oracle Tuxedoシステムは、サーバー・アプリケーションのかわりに自動的にTransactionCurrentオブジェクトを呼び出します。

次のような場合に、alwaysトランザクション・ポリシーをオブジェクトのインタフェースに割り当てます。

オブジェクトを自動的にトランザクションに関係させる必要がある場合、実装構成ファイルで、そのオブジェクトのインタフェースに次のポリシーを割り当てます。

アクティブ化ポリシー
トランザクション・ポリシー
  • process
  • [method]
  • transaction
always

注意: データベース・カーソルは、複数のトランザクションにまたがることができません。ただし、C++では、Oracle Tuxedo Universityサンプル・アプリケーションのCourseSynopsisEnumeratorオブジェクトは、データベース・カーソルを使用して、Universityデータベースからコースの概要に一致するものを検索します。データベース・カーソルは、複数のトランザクションにまたがることはできないので、CourseSynopsisEnumeratorオブジェクトのactivate_object()操作は、一致したすべてのコースの講義をメモリーに読み取ります。カーソルは、イテレータ・クラスによって管理されるので、CourseSynopsisEnumeratorオブジェクトでは認識できません。

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

オブジェクトをトランザクションのスコープ内で呼び出せるようにする必要がある場合、optionalトランザクション・ポリシーをそのオブジェクトのインタフェースに割り当てることができます。optionalトランザクション・ポリシーは、データベース書込み操作は実行しないが、トランザクション時の呼出しを可能にする必要があるオブジェクトに適しています。

次のポリシーを、そのオブジェクトのインタフェースに対して実装構成ファイルで指定し、オブジェクトを必要に応じてトランザクションに関係させることができます。

アクティブ化ポリシー
トランザクション・ポリシー
  • process
  • [method]
  • transaction
optional

トランザクション・ポリシーがoptionalのときに、アプリケーションのUBBCONFIGファイルでAUTOTRANパラメータが有効になっている場合、実装はトランザクションに関係します。トランザクションに関係するオブジェクトを含むサーバーは、XA準拠のリソース・マネージャに関連付けられているグループ内で設定する必要があります。

オブジェクトがデータベース書込み操作を実行しており、オブジェクトがトランザクションに関係できるようにする必要がある場合は、alwaysトランザクション・ポリシーを割り当てる方が適切です。ただし、目的に応じてoptionalポリシーを使用し、TransactionCurrentオブジェクトに対する呼出しに書込み操作をカプセル化できます。つまり、オブジェクトがまだトランザクション内にスコープ指定されていない場合、データを書き込む操作内で、トランザクションを開始およびコミットまたはロールバックするために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リソース・マネージャを使用すると、サーバー・アプリケーションで管理される別のオブジェクトが、データベースとの間のデータの読み書きをどのように実行するかについて、以下のような特定の要件が適用されます。

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アクティブ化ポリシーのオブジェクトへの割当ては、以下のような場合に適しています。

transactionアクティブ化ポリシーで使用するトランザクション・ポリシー

トランザクションがコミットされてからデータベースに書き込まれるまでオブジェクトが待機できるようにするには、実装構成ファイルで、そのオブジェクトのインタフェースに次のポリシーを割り当てます。

アクティブ化ポリシー
トランザクション・ポリシー
transaction
alwaysまたはoptional

注意: トランザクション・バウンド・オブジェクトは、Tobj_ServantBase::deactivate_object()操作内でトランザクションを開始することや、他のオブジェクトを呼び出すことはできません。deactivate_object()内でトランザクション・バウンド・オブジェクトが唯一可能な呼出しは、データベースへの書込み操作です。
注意: また、トランザクションに関与するオブジェクトがある場合、そのオブジェクトを管理するServerオブジェクトは、データをディスクに書き込まない場合でも、XAリソース・マネージャを開く、または閉じるための呼出しを含める必要があります (データをディスクに書き込まない、トランザクションに関与するオブジェクトがある場合、ヌル・リソース・マネージャを指定します)。XAリソース・マネージャのオープンおよびクローズの詳細は、「XAリソース・マネージャのオープン」「XAリソース・マネージャのクローズ」を参照してください。

 


ユーザー定義の例外

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

ユーザー定義の例外

Oracle Tuxedo CORBAクライアント/サーバー・アプリケーションにユーザー定義の例外を含めるには、以下の手順を実行する必要があります。

  1. OMG IDLファイルで、例外を定義し、それを使用できるオペレーションを指定します。
  2. 実装ファイルに例外をスローするコードを含めます。
  3. クライアント・アプリケーションのソース・ファイルに、例外を捕捉して処理するコードを含めます。

たとえば、TransactionsサンプルC++アプリケーションは、ユーザー定義の例外TooManyCreditsのインスタンスを含んでいます。クライアント・アプリケーションが学生をコースに登録するときに、学生が登録可能なコースの最大数を超えている場合、サーバー・アプリケーションはこの例外を返します。クライアント・アプリケーションは、この例外を受け取ると、学生をコースに登録するトランザクションをロールバックします。ここでは、サンプルとしてTooManyCredits例外を使用し、Oracle Tuxedo CORBAクライアント/サーバー・アプリケーションでユーザー定義の例外をどのように定義および実装できるかを説明します。

例外の定義

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

  1. 例外の定義、および例外によって送信されるデータの定義。たとえば、TooManyCredits例外は、学生が登録できる単位の最大数を表すshort型の整数値を渡すために定義します。したがって、TooManyCredits例外の定義には、次のOMG IDL文が含まれます。
  2. exception TooManyCredits
    {
    unsigned short maximum_credits;
    };
  3. 例外をスローする操作の定義に、例外を含めます。次の例は、Registrarインタフェースのregister_for_courses()操作に対するOMG IDL文を示したものです。
  4. 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サンプル・アプリケーションは、以下の作業を実行します。

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

Transactionsサンプル・アプリケーションの基本設計原理は、コース登録を一度に1つではなくグループ単位で処理することです。 この設計原理によって、Registerオブジェクトに対するリモート呼出しの数を最小化できます。

この設計を実装するにあたって、Transactionsサンプル・アプリケーションでは、「Oracle Tuxedoクライアントおよびサーバー・アプリケーションのトランザクションの統合」で説明したトランザクションの使用モデルを1つ示しています。 このモデルの特徴は、次のとおりです。

Universityサーバー・アプリケーションのオブジェクト状態に関する注意事項

Transactions Universityサンプル・アプリケーションはトランザクションに関与するため、Universityサーバー・アプリケーションは通常、オブジェクト状態に関していくつかの点(特にロールバック時の)を考慮する必要があります。 ロールバックが発生した場合、サーバー・アプリケーションは、関連するすべてのオブジェクトが、正しい状態に復元された永続状態を持つことを保証する必要があります。

Registrarオブジェクトは、データベース・トランザクションで使用されるため、このオブジェクトに対する最適な設計は、そのオブジェクトがトランザクションに関係するようにすること(alwaysトランザクション・ポリシーをこのオブジェクトのインタフェースに割り当てること)です。オブジェクト呼出し時にトランザクションがまだスコープ指定されていない場合、Oracle Tuxedoシステムは、トランザクションを自動的に開始します。

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

ただし、RegistrarFactoryオブジェクトは、トランザクション時に使用するデータを管理しないので、トランザクションから除外できます。 オブジェクトをトランザクションから除外することで、トランザクションに課せられる処理のオーバーヘッドを最小化します。

Registrarオブジェクトで定義されたオブジェクト・ポリシー

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

アクティブ化ポリシー
トランザクション・ポリシー
process
always

RegistrarFactoryオブジェクトで定義されたオブジェクト・ポリシー

RegistrarFactoryオブジェクトがトランザクションに関係するようにするために、ICFファイルは、Registrarインタフェースに対してignoreトランザクション・ポリシーを指定します。したがって、Transactionsサンプル・アプリケーションでは、ICFファイルで、RegistrarFactoryインタフェースに対して次のオブジェクト・ポリシーを指定します。

アクティブ化ポリシー
トランザクション・ポリシー
process
ignore

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

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

Transactionsサンプル・アプリケーションの構成の要件

Universityサンプル・アプリケーションでは、Oracleトランザクション・マネージャ・サーバー(TMS)を使用します。Oracleデータベースを使用するには、Oracleが提供する特定のファイルをサーバー・アプリケーションの構築プロセスで含める必要があります。Transactionsサンプル・アプリケーションの構築、構成および実行の詳細は、Oracle Tuxedoオンライン・ドキュメントのTransactionsサンプル・アプリケーションに関する項を参照してください。UBBCONFIGファイルの構成可能な設定の詳細は、「UBBCONFIGファイルをトランザクションに対応させて変更する」を参照してください。


  先頭に戻る       前  次