ここでは、Oracle TuxedoシステムでトランザクションCORBAアプリケーションを作成するのに必要な情報を提供します。始める前に、
第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アプリケーションでのトランザクションをサポートするトランザクション・サービスを提供します。トランザクション・サービスは、OMG
CORBAサービスの
トランザクション・サービス仕様に記述されているCORBAサービスのトランザクション・サービスの実装を提供します。この仕様では、トランザクション機能を提供するオブジェクト・サービスのインタフェースを定義しています。
ここでは、CORBAアプリケーションをサポートするトランザクション・サービスの機能と制限事項を説明します。
軽量クライアントは、不定期的に使用される単一ユーザーの未管理デスクトップ・システム上で動作します。オーナーは、使用しない場合にそれぞれのデスクトップ・システムをオフにすることができます。単一ユーザーの未管理デスクトップ・システムでは、トランザクションの調整などのネットワーク機能の実行は要求できません。特に、未管理システムでは、サーバー・リソースを必要とするトランザクションの失敗に対して原子性、一貫性、独立性、持続性などのACIDプロパティを保証する役割を果たすことはできません。Oracle Tuxedo CORBAリモート・クライアントは、軽量クライアントです。
トランザクション・サービスを利用すると、軽量クライアントは委任コミットを実行できます。つまり、トランザクション・サービスにより、軽量クライアントは、トランザクションの調整がサーバー・マシン上のトランザクション・マネージャに委任された状態で、トランザクションを開始および終了することができます。クライアント・アプリケーションは、ローカル・トランザクション・サーバーを必要としません。CORBAクライアントが使用するリモートTransactionCurrent実装は、実際のトランザクションの調整をサーバー上のトランザクション・マネージャに委譲します。
INSを使用するサード・パーティ・クライアントのサポート
Oracle Tuxedoリリース8.0以降では、CORBA Interoperable Naming Service (INS)がサポートされます。したがって、CORBAのオブジェクト・トランザクション・サービス(OTS)を実装したクライアントは、Oracle Tuxedo CORBAサーバーと通信し、トランザクションを開始および終了できます。INSを使用すると、標準OTS IDLファイルをコンパイルし、使用可能なスタブ・ファイルを作成できるサード・パーティ・クライアントORBは、Oracle Tuxedo CORBAトランザクション・マネージャと対話できます。ただし、サード・パーティORBをリソース・マネージャとして使用できるようにするトランザクション調整インタフェースがサポートされていないため、この対話処理は制限されます。Oracle提供のリソース・マネージャやXA準拠のリソース・マネージャのみが、トランザクションの調整に参加できます。さらに、Oracle提供およびXA準拠のリソース・マネージャは、トランザクションの調整にCORBAサービスOTSプロトコルではなくXAプロトコルを使用している場合にのみ、トランザクションの調整に参加できます。
つまり、サード・パーティ・クライアントORBを使用して、トランザクションを開始できます。また、クライアントは、トランザクションのロールバックまたはコミットをリクエストできますが、クライアントORBは、CORBAのOTSを使用して2フェーズ・コミット・プロトコルの調整に参加することはできません。
マルチスレッド・トランザクション・クライアントのサポート
リリース8.0では、Oracle Tuxedo CORBAは、トランザクション処理を行わないクライアントとトランザクション処理を行うクライアントに対してマルチスレッド・クライアントをサポートします。
CORBAアプリケーションの場合、OMG CORBAサービスのトランザクション・サービス仕様
で、クライアントがトランザクション・コンテキストの伝播を暗黙的にするか明示的にするかを選択できることが規定されています。Oracle Tuxedoでは、暗黙的な伝播を提供します
。明示的な伝播はできるかぎり使用しないでください。
明示的なトランザクションの伝播を使用して渡されるトランザクション・コンテキストに関連付けられたオブジェクトは、暗黙的なトランザクション伝播APIと混在
しないようにしてください。ただし、明示的な伝播は、トランザクション・メソッドが処理可能な場合に対してはどのような制約も課しません。トランザクションをコミットする前にすべてのトランザクション・メソッドが完了するかどうかは保証できません。
トランザクションの動作を管理すると、そのトランザクションに関わるすべてのトランザクション・オブジェクトでトランザクション・リクエストの処理が完了しないかぎり
commitが成功しないので、トランザクションの整合性が確保されます。暗黙的なトランザクションの伝播を使用する場合、トランザクション・サービスは、チェックされたトランザクションの振る舞いを提供します
。このトランザクションの振る舞いは、The Open Groupによって定義されたリクエスト/レスポンスのプロセス間通信モデルで提供されたものと同じです。たとえば、CORBAアプリケーションの場合、トランザクション・サービスは、OMG CORBAサービスのトランザクション・サービス仕様で記述されているとおり、
replyチェック、
commitチェック、
resumeチェックを実行します。
チェックされていないトランザクションの振る舞いは、トランザクションの整合性を提供するアプリケーションに完全に依存します。明示的な伝播を使用した場合、トランザクション・サービスではチェックされたトランザクションの振る舞いを提供しないため、トランザクションの整合性は保証されません。
Oracle Tuxedo CORBAでは、トランザクションを終了できるのは、そのトランザクションを作成したクライアントのみです。
注意:
|
クライアントは、別のオブジェクトのサービスをリクエストしたサーバー・オブジェクトの場合もあります。
|
Oracle Tuxedo CORBAではフラット・トランザクション・モデルを実装します。ネストされたトランザクションはサポートされていません。
CORBAリモート・クライアントとOracle Tuxedoドメインの相互運用性
Oracle Tuxedo
CORBA
は、同じトランザクション内で、異なる
Oracle Tuxedoドメインにあるサーバー・オブジェクトのメソッドを呼び出すリモート・クライアントをサポートします。
リモートCORBAクライアントでは、同じOracle Tuxedoドメインへの複数の接続がある場合、同じトランザクション内の別の接続上にあるサーバー・オブジェクトに対して呼出しを実行できます。
Oracle Tuxedo CORBAは、Oracle Tuxedoドメインでサーバー・オブジェクトのメソッドを呼び出すネイティブ・クライアントをサポートします。さらに、Oracle Tuxedoは、同じOracle Tuxedoドメイン内の同じ、または異なるプロセスで、ほかのオブジェクトのメソッドを呼び出すサーバー・オブジェクトをサポートしています。
Oracle Tuxedoアプリケーションでは、ファクトリ・ベース・ルーティングが複数のドメインにわたって正しく構成されているかぎり、トランザクションは複数のドメインで使用できます。複数のドメインにわたるトランザクションをサポートするには、現在の(ローカル)ドメインで使用されるが、別の(リモート)ドメインに存在するファクトリ・オブジェクトを識別するように
factory_finder.iniファイルを構成する必要があります。詳細は、
『Oracle Tuxedo Domainsコンポーネントの使用』を参照してください
。
クライアント・アプリケーションは、1つのドメイン内にアクティブなBootstrapオブジェクトとTransactionCurrentオブジェクトを1つだけ持つことができます。Oracle Tuxedo CORBAでは、リモートOracle Tuxedoドメインとの間のトランザクションのエクスポートまたはインポートをサポートしていません。
ただし、トランザクションは、順次的に複数のドメインを含むことができます。たとえば、ドメインAでアクティブなトランザクションを持つサーバーは、それと同じトランザクション・コンテキスト内のドメインBでサーバーと通信できます。
トランザクション・サービスとトランザクション処理の関係
トランザクション・サービスは、様々なトランザクション処理のサーバー、インタフェース、プロトコル、および規格と次のように関連しています。
•
|
Oracle Tuxedo ATMIサーバーに対するサポート。Oracle Tuxedo CORBAトランザクション・サービスを使用するサーバーは、同じドメインのほかのアプリケーション・トランザクション・モニター・インタフェース(ATMI)サーバー・プロセスに対して呼出しを実行できます。さらに、ATMIサービスは、トランザクションに関与するコンテキストでも、関与しないコンテキストでも、Oracle Tuxedoドメイン・ゲートウェイを介して、同じドメインおよび複数のドメインの両方で、CORBAオブジェクトを呼び出すことができます。ただし、Oracle Tuxedo CORBAは、Oracle Tuxedoドメイン内のATMIサービスを呼び出すリモート・クライアントまたはネイティブ・クライアントをサポートしません。
|
•
|
The Open GroupのXAインタフェースに対するサポート。The Open Groupのリソース・マネージャは、2フェーズ・コミット・プロトコルをThe Open GroupのXAインタフェースで制御できるようにすることで、分散トランザクションに関与できるリソース・マネージャです。Oracle Tuxedoは、The Open Groupリソース・マネージャとの対話処理をサポートしています。
|
•
|
OSI TPプロトコルに対するサポート。開放型システム間相互接続のトランザクション処理(OSI TP)は、国際標準化機構(ISO)によって定義されたトランザクション・プロトコルです。Oracle Tuxedo CORBAは、OSI TPトランザクションとの対話処理をサポートしません。
|
•
|
LU 6.2プロトコルに対するサポート。Systems Network Architecture (SNA) LU 6.2は、IBMによって定義されたトランザクション・プロトコルです。Oracle Tuxedo CORBAは、LU 6.2トランザクションとの対話処理をサポートしません。
|
•
|
ODMG標準に対するサポート。ODMG-93はObject Database Management Group (ODMG)によって定義された規格であり、Object Database Management Systemにアクセスするための移植可能なインタフェースを規定しています。Oracle Tuxedo CORBAは、ODMGトランザクションとの対話処理をサポートしません。
|
トランザクション・サービスは、トランザクションの参加リソースをモニターし、障害や非アクティブの状態の有無をチェックします。Oracle Tuxedoシステムは、障害が発生した場合にアプリケーションの実行を維持するための管理ツールを提供します。Oracle Tuxedo CORBAは、Oracle Tuxedoトランザクション管理システムで構築されるので、アプリケーションの実行を維持するためのOracle Tuxedo機能を継承します。
トランザクション・サービスには次の制約があります。
•
|
Oracle Tuxedo CORBAでは、クライアント・オブジェクトまたはサーバー・オブジェクトは、別のトランザクションに関与している(または、参加している)オブジェクトのメソッドを呼び出すことは できません。クライアントまたはサーバーがメソッドを呼び出そうとすると、例外が返されます。
|
•
|
CORBAアプリケーションでは、Oracle Tuxedo CORBAトランザクション・サービス・ライブラリのトランザクションを使用しているサーバー・アプリケーション・オブジェクトは、TPフレームワーク機能を 必要とします。TPフレームワークの詳細は、 『CORBAプログラミング・リファレンス』のTPフレームワークに関する項を参照してください。
|
•
|
CORBAアプリケーションの場合、 Currentオブジェクトの rollbackメソッドからの戻り値は非同期的です。
|
その結果、ロールバックされたトランザクションに関与していた(または、参加していた)オブジェクトは、Oracle Tuxedoによってクリアされた状態を
少し後で取得します。したがって、Oracle Tuxedoがこれらのオブジェクトの状態をクリアするまで、他のクライアントは、これらのオブジェクトを別のトランザクションに関与させることは
できません。この状態はごく短い時間しか存在しないため、通常は製品アプリケーションで問題になることはありません。この状態に対する簡単な対策は、短時間(通常は1秒)の遅延の後で適切なオペレーションを試してみることです。
•
|
Oracle Tuxedo CORBAアプリケーションでは、クライアントは、トランザクションのコンテキスト内で、 NEVER、 OPTIONAL、または ALWAYSトランザクション・ポリシーを持つサーバー・オブジェクトに対する一方向のメソッド呼出しを実行できません。
|
一方向のメソッド呼出しのため、エラーまたは例外はクライアントに返されません。ただし、サーバー・オブジェクトのメソッドは実行されず、適切なエラー・メッセージがログに書き込まれます。クライアントは、トランザクションのコンテキスト内で、
IGNOREトランザクション・ポリシーを持つサーバー・オブジェクトに対する一方向のメソッド呼出しを実行できます。この場合、サーバー・オブジェクトのメソッドは実行されますが、トランザクションのコンテキスト内ではありません。トランザクション・ポリシーの詳細は、
『CORBAプログラミング・リファレンス』の実装構成ファイル(ICF)に関する項を参照してください。
CORBAアプリケーションのトランザクション・サービス
ここでは、実装固有のものとしてCORBAのオブジェクト・トランザクション・サービスの一部を特に取り上げ、Oracle TuxedoがどのようにOTSを実装するかを説明します。また、トランザクションの開始、終了、中断、または再開、およびトランザクションに関する情報の取得に使用するOTSアプリケーション・プログラミング・インタフェース(API)について説明します。
Bootstrapオブジェクトを使用したTransactionCurrentオブジェクトへの初期リファレンスの取得
TransactionCurrentオブジェクトを使用してトランザクション・サービスAPIおよびトランザクション・サービスAPIの拡張(後述)にアクセスするには、アプリケーションは、次のオペレーションを完了する必要があります。
1.
|
Bootstrapオブジェクトを作成します。Bootstrapオブジェクトの作成方法の詳細は、 『CORBAプログラミング・リファレンス』のCORBAブートストラップ処理のプログラミング・リファレンスに関する項を参照してください。
|
2.
|
Bootstrapオブジェクトの resolve_initial_reference("TransactionCurrent")メソッドを呼び出します。標準CORBAオブジェクト・ポインタが返されます。このBootstrapオブジェクトのメソッドについては、 『CORBAプログラミング・リファレンス』を参照してください。
|
3.
|
アプリケーションは、トランザクション・サービスAPIのみを必要とする場合、前述のステップ2で返されたオブジェクト・ポインタに対して CosTransactionsCurrent::_narrow() (C++の場合)を発行する必要があります。
|
アプリケーションは、拡張を含むトランザクション・サービスAPIを必要とする場合、前述のステップ2で返されたオブジェクト・ポインタに対して
Tobj::TransactionCurrent::_narrow() (C++の場合)を発行する必要があります。
INSを使用したTransactionFactoryオブジェクトへの初期リファレンスの取得
Oracle Tuxedoでは、サード・パーティ・クライアントによるCORBA Interoperable Naming Service (INS)も使用して初期トランザクション・オブジェクト参照を取得することもできます。INSは、
ORB::resolve_initial_references()操作を使用します。
リスト2-1に、クライアント・アプリケーションがINSを使用してTransactionFactoryオブジェクトへのオブジェクト参照を取得する方法の例を示します。完全なサンプル・コードについては、University Sampleのクライアント・アプリケーションを参照してください。
リスト2-1
INSを使用するクライアント・アプリケーションのサンプル・コード
// Get the factory finder from the ORB:
CORBA::Object_var v_fact_finder_oref =
orb->resolve_initial_references("FactoryFinder");
// Narrow the factory finder :
Tobj::FactoryFinder_var v_fact_finder_ref =
Tobj::FactoryFinder::_narrow(v_fact_finder_oref.in());
// Get the TransactionFactory from the FactoryFinder
CORBA::Object_var v_txn_fac_oref =
v_fact_finder_ref->find_one_factory_by_id(
"IDL:omg.org/CosTransactions/TransactionFactory:1.0");
// Narrow the TransactionFactory object reference
CosTransactions::TransactionFactory_var v_txn_fac_ref =
CosTransactions::TransactionFactory::_narrow(
v_txn_fac_oref.in());
ORB::resolve_initial_references()操作の使用方法の詳細は、
『CORBAプログラミング・リファレンス』のCORBAブートストラップ処理のプログラミング・リファレンスに関する項を参照してください。
ここでは、Oracle Tuxedoがトランザクション・サービスをサポートするために実装する
CosTransactionsモジュールのCORBAベース・コンポーネントについて説明します。これらのコンポーネントの詳細は、「OMG CORBA Services
Transaction Service Specification, Version 1.1」(2000年5月)を参照してください。
リスト2-2には、サポートされているデータ型が示されています。
リスト2-2
トランザクション・サービスでサポートされているデータ型
enum Status {
StatusActive,
StatusMarkedRollback,
StatusPrepared,
StatusCommitted,
StatusRolledBack,
StatusUnknown,
StatusNoTransaction,
StatusPreparing,
StatusCommitting,
StatusRollingBack
};
//
This information comes from the OMG Transaction Service
// Specification, Version 1.1, May 2000. Used with permission
// of the OMG.
リスト2-3には、サポートされているIDLコードの例外が示されています。
リスト2-3
トランザクション・サービスでサポートされている例外
// Heuristic exceptions
exception HeuristicMixed {};
exception HeuristicHazard {};
// Other transaction-specific exceptions
exception SubtransactionsUnavailable {};
exception NoTransaction {};
exception InvalidControl {};
exception Unavailable {};
注意:
|
この情報は、「OMG CORBA Services Transaction Service Specification, Version 1.1」(2000年5月)によるものです。使用にあたってはOMGの許可を得ています。
|
表2-1
トランザクション・サービスでサポートされている例外
|
|
|
ヒューリスティックな決定がなされたこと、関連する更新の一部がコミットされ、ほかはロールバックされたことを通知するために、リクエストに対してこの例外が発生します。
|
|
ヒューリスティックな決定がなされたこと、関連するすべての更新の処理が不明であること、および処理が認識された更新について、すべてがコミットされたかロールバックされたことを通知するために、リクエストに対してこの例外が発生します。したがって、 HeuristicMixed例外は、 HeuristicHazard例外よりも優先されます。
|
SubtransactionsUnavailable
|
クライアントにすでに関連するトランザクションがある場合、 Currentインタフェースの beginメソッドに対して、この例外が発生します。
|
|
クライアント・アプリケーションに関連付けられているトランザクションがない場合、 Currentインタフェースの rollbackおよび rollback_onlyメソッドに対して、この例外が発生します。
|
|
パラメータが現在の実行環境で有効ではない場合、 Currentインタフェースの resumeメソッドに対して、この例外が発生します。
|
|
Controlインタフェースがリクエストされたオブジェクトを提供できない場合、 Controlインタフェースの get_terminatorメソッドと get_coordinatorメソッドに対して、この例外が発生します。
|
Currentインタフェースは、トランザクション・サービスのクライアントがスレッドとトランザクションの関連付けを明示的に管理できるようにするメソッドを定義します。また、
Currentインタフェースは、ほとんどのアプリケーションでトランザクション・サービスを簡単に使用できるようにするメソッドも定義します。これらのメソッドは、トランザクションの開始、終了、一時停止、再開、および現在のトランザクションに関する情報の取得に使用できます。
CosTransactionsモジュールは、
Currentインタフェース(
リスト2-4を参照)を定義します。
// Current transaction
interface Current : CORBA::Current {
void begin()
raises(SubtransactionsUnavailable);
void commit(in boolean report_heuristics)
raises(
NoTransaction,
HeuristicMixed,
HeuristicHazard
);
void rollback()
raises(NoTransaction);
void rollback_only()
raises(NoTransaction);
Status get_status();
string get_transaction_name();
void set_timeout(in unsigned long seconds);
Control get_control();
Control suspend();
void resume(in Control which)
raises(InvalidControl);
};
//
This information comes from the OMG Transaction Service
// Specification, Version 1.1, May 2000. Used with permission
// of the OMG.
表2-2では、
Currentトランザクション・メソッドについて説明します。
注意:
|
この情報は、「OMG CORBA Services Transaction Service Specification, Version 1.1」(2000年5月)によるものです。使用にあたってはOMGの許可を得ています。
|
表2-2
Currentオブジェクトのトランザクション・メソッド
|
|
|
新しいトランザクションを作成します。スレッドが新しいトランザクションに関連付けられるように、クライアント・アプリケーションのトランザクション・コンテキストが変更されます。クライアント・アプリケーションがすでにトランザクションに関連付けられている場合は、 SubtransactionsUnavailable例外が発生します。トランザクション開始時にエラーが発生したためにクライアント・アプリケーションをトランザクション・モードに配置できない場合は、標準システム例外 INVALID_TRANSACTIONが発生します。呼出し時のコンテキストが無効な場合は、標準システム例外 BAD_INV_ORDERが発生します。
|
|
クライアント・アプリケーションに関連付けられているトランザクションがない場合は、 NoTransaction例外が発生します。
呼出し時のコンテキストが無効な場合は、標準システム例外 BAD_INV_ORDERが発生します。
システムでトランザクションのロールバックを決定すると、標準例外 TRANSACTION_ROLLEDBACKが発生し、スレッドのトランザクション・コンテキストがNULLに設定されます。
ヒューリスティックな決定がなされたこと、関連する更新の一部がコミットされ、他はロールバックされたことを通知するために、 HeuristicMixed例外が発生します。ヒューリスティックな決定がなされたこと、関連するすべての更新の処理が不明であること、および処理が認識された更新について、すべてがコミットされたかロールバックされたことを通知するために、 HeuristicHazard例外が発生します。 HeuristicMixed例外は、 HeuristicHazard例外よりも優先されます。ヒューリスティックな例外が発生するか、操作が正常に完了した場合、スレッドのトランザクション例外コンテキストはNULLに設定されます。
オペレーションが正常に完了した場合、スレッドのトランザクション・コンテキストはNULLに設定されます。
|
|
クライアント・アプリケーションに関連付けられているトランザクションがない場合は、 NoTransaction例外が発生します。
呼出し時のコンテキストが無効な場合は、標準システム例外 BAD_INV_ORDERが発生します。
オペレーションが正常に完了した場合、スレッドのトランザクション・コンテキストはNULLに設定されます。
|
|
クライアント・アプリケーションに関連付けられているトランザクションがない場合は、 NoTransaction例外が発生します。それ以外の場合、トランザクションの可能な結果のみがロールバックされるように、クライアント・アプリケーションに関連付けられているトランザクションが変更されます。
|
|
クライアント・アプリケーションに関連付けられているトランザクションがない場合は、 StatusNoTransaction値が返されます。それ以外の場合、このメソッドは、クライアント・アプリケーションに関連付けられているトランザクションのステータスを返します。
|
|
クライアント・アプリケーションに関連付けられているトランザクションがない場合は、空の文字列が返されます。それ以外の場合、このメソッドは、トランザクションを説明する出力可能な文字列(特に、The Open Groupで指定されている XID)を返します。返された文字列は、デバッグ時のサポートを目的としています。
|
|
このメソッドは、タイムアウト値に影響を与えるターゲット・オブジェクトに関連付けられている状態変数を変更します。タイムアウト値は、その後の beginメソッドの呼出しによって作成されるトランザクションに関連付けられています。
トランザクション・タイムアウトの初期値は300秒です。0より大きい引数値を付けて set_timeout()を呼び出すと、新しいタイムアウト値が指定されます。引数0を付けて set_timeout()を呼び出すと、タイムアウト値がデフォルトの300秒に戻ります。
set_timeout()を呼び出すと、その後の beginの呼出しで作成されたトランザクションは、指定した作成後の秒数が経過するまでに完了しなかった場合にロールバックの対象になります。
注意:
|
トランザクション・タイムアウトの初期値は300秒です。 beginメソッドを使用せずに、 AUTOTRANを介してトランザクションを開始した場合、タイムアウト値は、Oracle Tuxedo構成ファイルの TRANTIMEで指定した値です。詳細は、 第5章「トランザクションの管理」を参照してください。
|
|
|
クライアントがトランザクションに関連付けられていない場合は、NULLオブジェクト参照が返されます。それ以外の場合、クライアント・アプリケーションに関連付けられているトランザクション・コンテキストを表す Controlオブジェクトが返されます。このオブジェクトは、このコンテキストを再確立するために resumeメソッドに提供できます。
|
|
クライアント・アプリケーションがトランザクションに関連付けられていない場合は、NULLオブジェクト参照が返されます。
関連付けられているトランザクションが、可能なトランザクションの結果のみをロールバックする状態にある場合、標準システム例外 TRANSACTION_ROLLEDBACKが発生し、クライアント・アプリケーションに関連付けられるトランザクションはなくなります。
呼出し時のコンテキストが無効な場合は、標準システム例外 BAD_INV_ORDERが発生します。トランザクションに関する呼出し側の状態は変化しません。
それ以外の場合、クライアント・アプリケーションに関連付けられているトランザクション・コンテキストを表すオブジェクトが返されます。同じクライアントは、このコンテキストを再確立するために、このオブジェクトを resumeメソッドに提供できます。さらに、クライアント・アプリケーションに関連付けられるトランザクションはなくなります。
注意:
|
「The Common Object Request Broker: Architecture and Specification, Revision 2.4」にあるとおり、標準システム例外 TRANSACTION_ROLLEDBACKは、リクエストに関連付けられているトランザクションがすでにロールバックされているか、ロールバックとしてマークされていることを示します。したがって、トランザクションのかわりに実行される処理は無効になるので、リクエストされたメソッドが実行できなかったか、実行されなかったことを示します。
|
|
|
クライアントにすでに関連付けられているトランザクションが、可能なトランザクションの結果のみをロールバックする状態にある場合、標準システム例外 TRANSACTION_ROLLEDBACKが発生し、クライアント・アプリケーションに関連付けられるトランザクションはなくなります。
呼出し時のコンテキストが無効な場合は、標準システム例外 BAD_INV_ORDERが発生します。
呼出し側が、1つまたは複数のリソース・マネージャとグローバル・トランザクション外の作業に関与しているため、システムがグローバル・トランザクションを再開できない場合、標準システム例外 INVALID_TRANSACTIONが発生します。
パラメータがNULLオブジェクト参照の場合、クライアント・アプリケーションに関連付けられるトランザクションはなくなります。現在の実行環境でパラメータが有効な場合、クライアント・アプリケーションは、(以前のトランザクションにかわって)そのトランザクションに関連付けられます。それ以外の場合、 InvalidControl例外が発生します。
注意:
|
標準システム例外 TRANSACTION_ROLLEDBACKの定義については、 suspendを参照してください。
|
|
Controlインタフェースを使用すると、プログラムがトランザクション・コンテキストを明示的に管理および伝播できるようになります。
Controlインタフェースをサポートするオブジェクトは、特定のトランザクションに暗黙的に関連付けられます。
リスト2-5では、
CosTransactionsモジュールで定義されている
Controlインタフェースを示します。
interface Control {
Terminator get_terminator()
raises(Unavailable);
Coordinator get_coordinator()
raises(Unavailable);
};
//
This information comes from the OMG Transaction Service
// Specification, Version 1.1, May 2000. Used with permission
// of the OMG.
Controlインタフェースは、
suspendメソッドおよび
resumeメソッドでのみ使用します。
Terminatorインタフェースは、トランザクションをコミットまたはロールバックするオペレーションをサポートします。通常、これらのオペレーションは、トランザクションの開始元によって使用されます。トランザクション・サービスの実装は、Terminatorの使用範囲を制限できます。最低で、単一スレッド内で使用できます。
リスト2-6では、Terminatorインタフェースを示します。
interface Terminator {
void commit(in boolean report_heuristics)
raises(
HeuristicMixed,
HeuristicHazard
);
void rollback();
};
//
This information was taken from the OMG Transaction Service
// Specification, Version 1.1, May 2000. Used with permission
// of the OMG.
表2-3では、Terminatorインタフェースのメソッドを示します。
表2-3
Terminationインタフェースのメソッド
|
|
|
トランザクションがrollback onlyとしてマークされておらず、トランザクションのすべての参加リソースがコミットに同意した場合、トランザクションはコミットされ、操作は正常に終了します。それ以外の場合、トランザクションはロールバックされ(次の rollbackメソッドを参照)、 TRANSACTION_ROLLEDBACK標準例外が発生します。
report_heuristicsパラメータがtrueの場合、トランザクション・サービスは、 HeuristicMixed例外と HeuristicHazard例外を使用して、矛盾している(またはその可能性がある)結果を通知します。トランザクション・サービスの実装では、オプションのCORBA通知サービスを使用すると、ヒューリスティックな決定をレポートできます。
コミットまたはロールバックされていないトランザクションのサブトランザクションがある場合、または完了していないトランザクションに関連付けられている(あるいはその可能性がある)アクティビティがある場合、 commitオペレーションはトランザクションをロールバックできます。このようなエラー・チェックの性質と程度は、実装によって異なります。最上位トランザクションがコミットされると、回復可能なオブジェクトに対する、このトランザクションの範囲内の変更は確定され、他のトランザクションまたはクライアントでも認識可能なものになります。サブトランザクションがコミットされた場合は、リソースで適用された独立性の程度に応じて、ほかの関連するトランザクションでも変更が認識可能になります。
|
|
トランザクションがロールバックされると、回復可能なオブジェクトに対する、このトランザクションの範囲内の変更(下位トランザクションによる変更も含む)がロールバックされます。トランザクションでロックされたすべてのリソースは、リソースで適用された独立性の程度に応じて、ほかの関連するトランザクションで使用可能になります。
|
TransactionalObjectインタフェース
Oracle Tuxedoリリース8.0以降では、
CosTransactions::TransactionalObjectは、トランザクションに関係することを示すオブジェクトによって使用されなくなりました。インタフェースがTransactionalObjectから継承され、ICFが異なるトランザクション・ポリシーを示している場合、警告が発行されます。TransactionalObjectは、他の目的には使用されません。オブジェクトをトランザクションに関係させるために設定する必要があるトランザクション・ポリシーの詳細は、
『CORBAプログラミング・リファレンス』の実装構成ファイル(ICF)に関する項を参照してください。
CosTransactionsモジュールは、
TransactionalObjectインタフェース(
リスト2-7を参照)を定義します。このインタフェースで定義されるメソッドはありません。単にマーカーとして使用されます。
リスト2-7
TransactionalObjectインタフェース
interface TransactionalObject {
};
//
This information was taken from the OMG Transaction Service
// Specification, Version 1.1, May 2000. Used with permission
// of the OMG.
TransactionFactoryインタフェース
TransactionFactoryインタフェースは、トランザクションの開始元がトランザクションを開始できるようにするためのものです。このインタフェースは、最上位トランザクションの新しい表現を作成する、作成と再作成の2つの操作を定義します。TransactionFactoryは、ORBインタフェースの
resolve_initial_reference()操作ではなく、ライフ・サイクル・サービスの
FactoryFinderインタフェースを使用して検索します。
リスト2-8では、
TransactionFactoryインタフェースを示します。
注意:
|
TransactionFactoryインタフェースの Control recreateメソッドはサポートされていません。
|
リスト2-8
TransactionFactoryインタフェース
interface TransactionFactory {
Control create(in unsigned long time_out);
Control recreate(in PropagationContext ctx);
};
//
This information was taken from the OMG Transaction Service
// Specification, Version 1.1, May 2000. Used with permission
// of the OMG.
表2-4では、
TransactionFactoryインタフェースのメソッドを示します。
表2-4
TransactionFactoryインタフェースのメソッド
|
|
|
新しい最上位トランザクションを作成し、 Controlオブジェクトを返します。 Controlオブジェクトは、新しいトランザクションへの参加を管理または制御する際に使用できます。トランザクション・サービスの実装により、他の実行環境への送信や、そこで使用するための Controlオブジェクトの機能が制限されます。少なくとも、クライアント・アプリケーションでは使用できます。
パラメータが0以外の値 nの場合、新しいトランザクションは、 n秒が経過するまでに完了しなかったときにロールバックの対象になります。パラメータが0の場合、アプリケーション指定のタイムアウトは設定されません。
|
|
|
その他のCORBAのオブジェクト・トランザクション・サービス・インタフェース
その他のCORBAのオブジェクト・トランザクション・サービス・インタフェースはサポート
されていません。前述の
Currentインタフェースは、Bootstrapオブジェクトから取得した場合にのみサポートされます。前述の
Controlインタフェースは、Currentオブジェクトの
get_controlメソッドおよび
suspendメソッドで取得した場合にのみサポートされます。
ここでは、前述のCORBAのオブジェクト・トランザクション・サービスAPIの特定の拡張について説明します。ここで説明するAPIを使用すると、アプリケーションは、The Open Groupリソース・マネージャを開く、または閉じることができるようになります。
次のAPIは、2フェーズ・コミット・プロトコルをThe Open GroupのXAインタフェースで制御できるようにすることで、リソース・マネージャが簡単に分散トランザクションに関与できるようにします。
次の定義とインタフェースは、
Tobjモジュールで定義されます。
リクエストにより、リソース・マネージャを開く、または閉じる際に失敗したことを通知するために例外が発生します。
TransactionCurrentインタフェース
このインタフェースは、
CosTransactionsモジュールの
Currentインタフェースのすべてのメソッドをサポートしており、
『CORBAプログラミング・リファレンス』のC++ブートストラップ処理オブジェクトのプログラミング・リファレンスに関する項で説明されています。さらに、このインタフェースは、リソース・マネージャをオープン、またはクローズするAPIをサポートしています。
リスト2-9では、
Tobjモジュールで定義されている
TransactionCurrentインタフェースを示します。
リスト2-9
TransactionCurrentインタフェース
Interface TransactionCurrent: CosTransactions::Current {
void open_xa_rm()
raises(RMfailed);
void close_xa_rm()
raises(Rmfailed);
}
表2-5では、リソース・マネージャ固有のAPIを説明しています。これらのAPIの詳細は、
『CORBAプログラミング・リファレンス』を参照してください。
表2-5
Currentインタフェースのリソース・マネージャのAPI
|
|
|
このメソッドは、このプロセスがリンクされているThe Open Groupのリソース・マネージャを開きます。リソース・マネージャを開いているときに障害が発生すると、 RMfailed例外が発生します。
リモート・クライアントまたはネイティブ・クライアントでこのメソッドを呼び出そうとすると、標準システム例外 NO_IMPLEMENTが発生します。
|
|
このメソッドは、このプロセスがリンクされているThe Open Groupのリソース・マネージャをクローズします。リソース・マネージャをクローズしているときに障害が発生すると、 RMfailed例外が発生します。関数呼出し時のコンテキストが無効な場合(呼出し側がトランザクション・モードの場合など)は、標準システム例外 BAD_INV_ORDERが発生します。
リモート・クライアントまたはネイティブ・クライアントでこのメソッドを呼び出そうとすると、標準システム例外 NO_IMPLEMENTが発生します。
|
Oracle Tuxedo CORBAアプリケーションのトランザクションの使用に関する注意事項
Oracle Tuxedo CORBAクライアント/サーバー・アプリケーションにトランザクションを統合する場合は、次のガイドライン考慮してください。
•
|
ネストされたトランザクションは、Oracle Tuxedoシステムではサポートされていません。既存のトランザクションがすでにアクティブである場合に、新しいトランザクションを開始することはできません。既存のトランザクションを中断すれば、新しいトランザクションを開始できます。しかし、中断したトランザクションを後で再開できるのは、トランザクションを中断したオブジェクトだけです。
|
•
|
トランザクションを終了できるエンティティは、トランザクションを開始したオブジェクトのみです。厳密には、このオブジェクトはクライアント/アプリケーション、TPフレームワーク、またはオブジェクト(サーバー・アプリケーションによって管理されているもの)のいずれかです。トランザクションの範囲内で呼び出されたオブジェクトは、トランザクションを中断および再開できます(また、トランザクションが中断されている間、オブジェクトは、ほかのトランザクションを開始および終了できます)。しかし、トランザクションを開始しないかぎり、オブジェクト内でトランザクションを終了できません。
|
•
|
Oracle Tuxedoは、並列トランザクションをサポートしていません。オブジェクトは、一度に1つのトランザクションにのみ関与できる。オブジェクトは、トランザクション全体の期間で、トランザクションに関与します。また、現在のトランザクションが完了した後でのみ別のトランザクションに関与できます。
|
•
|
Oracle Tuxedoは、現在トランザクションに関与するオブジェクトに対して、キューにリクエストを登録しません。トランザクションに関与しないクライアント・アプリケーションが、現在トランザクション内にあるオブジェクトに対してオペレーションを呼び出そうとすると、次のエラー・メッセージが発行されます。
|
トランザクション内にあるクライアントが、現在別のトランザクション内にあるオブジェクトに対してオペレーションを呼び出そうとすると、次のエラー・メッセージが発行されます。
CORBA::INVALID_TRANSACTION
•
|
トランザクション・バウンド・オブジェクトの場合、 Tobj_ServantBase::deactivate_object()操作ですべての状態を処理することを検討してください。トランザクションの結果は、 deactivate_object()の呼出し時に認識されるので、これによって、オブジェクトは状態を正しくかつ簡単に処理できるようになります。
|
•
|
複数の操作があるが、オブジェクトの永続的な状態に影響を与えるものはわずかしかないメソッド・バウンド・オブジェクトでは、次のことを検討してください。
|
•
|
トランザクション・ポリシーとして optionalを割り当てます。
|
•
|
TransactionCurrentオブジェクトに対して呼出しを実行することで、書込みオペレーションをトランザクション内にスコープ指定します。
|
トランザクション外でオブジェクトが呼び出された場合、データの読取りに対するトランザクションのスコープにオーバーヘッドは生じません。この方法で、トランザクション内でオブジェクトが呼び出されるかどうかに関係なく、オブジェクトのすべての書込み操作は、トランザクションに関係する形で処理されます。
•
|
トランザクションのロールバックは非同期的です。したがって、トランザクション・コンテキストがアクティブな場合でも、オブジェクトを呼び出すことは可能です。このようなオブジェクトを呼び出そうとすると、例外が発生します。
|
•
|
トランザクション・ポリシーとして alwaysを割り当てたオブジェクトが、クライアント・アプリケーションではなくOracle Tuxedoシステムで開始されたトランザクションに関与している場合は、次に注意してください。
|
•
|
サーバー・アプリケーションがトランザクションをrollback onlyとしてマークし、サーバーがCORBA例外をスローした場合、クライアント・アプリケーションはCORBA例外を受け取ります。
|
•
|
サーバー・アプリケーションがトランザクションをrollback onlyとしてマークし、サーバーがCORBA例外をスロー しない場合、クライアント・アプリケーションは OBJ_ADAPTER例外を受け取ります。この場合、Oracle Tuxedoシステムは、トランザクションをロールバックします。ただし、クライアント・アプリケーションは、トランザクションがOracle Tuxedoドメインでスコープ指定されていないことをまったく認識していません。
|
•
|
クライアント・アプリケーションがトランザクションを開始し、サーバー・アプリケーションがトランザクションをロールバックとしてマークしている場合、次のいずれかが行われます。
|
•
|
サーバーがCORBA例外をスローした場合、クライアント・アプリケーションは、CORBA例外を受け取ります。
|
•
|
サーバーがCORBA例外をスローしなかった場合 、クライアント・アプリケーションは、 TRANSACTION_ROLLEDBACK例外を受け取ります。
|
表2-6では、UserTransactionオブジェクトのメソッドを示します。
表2-6
UserTransactionオブジェクトのメソッド
|
|
|
|
|
現在のスレッドに関連付けられているトランザクションをコミットします。
|
|
トランザクション・ステータスを返します。現在のスレッドに関連付けられているトランザクションがない場合は、 STATUS_NO_TRANSACTIONを返します。
トランザクション・ステータスは、次のいずれかの値です。
|
|
現在のスレッドに関連付けられているトランザクションをロールバックします。
|
|
トランザクションの可能な結果のみがロールバックされるように、現在のスレッドに関連付けられているトランザクションをマークします。
|
|
beginメソッドで現在のスレッドが開始したトランザクションのタイムアウト値を指定します。アプリケーションが beginメソッドを呼び出していない場合、トランザクション・サービスは、トランザクション・タイムアウトのデフォルト値を使用します。
|
UserTransactionメソッドがスローする例外
表2-7では、UserTransactionオブジェクトのメソッドがスローする例外を示します。
表2-7
UserTransactionメソッドがスローする例外
|
|
|
ヒューリスティックな決定がなされたこと、関連する更新の一部がコミットされ、ほかはロールバックされたことを通知するためにスローされます。
|
HeuristicRollbackException
|
ヒューリスティックな決定がなされたこと、関連する更新の一部がロールバックされたことを通知するためにスローされます。
|
|
ネストされたトランザクションなど、リクエストされたオペレーションがサポートされていないときにスローされます。
|
|
トランザクションがrollback onlyとしてマークされているか、トランザクションがコミットではなくロールバックされたときにスローされます。
|
|
現在のスレッドがトランザクションに関連付けられていない場合にスローされます。
|
|
スレッドによるトランザクションのコミットが認められないことを通知するためにスローされます。
|
|
トランザクション・マネージャで予期しないエラーが発生し、以降のトランザクション・サービスを続行できなくなったことを示すために、トランザクション・マネージャによってスローされます。
|