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