|
ここでは、Oracle Tuxedo システムでトランザクション CORBA アプリケーションを作成するのに必要な情報を提供します。始める前に、「トランザクションについて」を読む必要があります。
注意 : | 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 実装は、実際のトランザクションの調整をサーバ上のトランザクション マネージャに委譲します。
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
が成功しないようにすることでトランザクションの整合性を提供します。暗黙的なトランザクションの伝播を使用する場合、トランザクション サービスは、チェックされたトランザクションの振る舞いを提供します。このトランザクションの振る舞いは、Open Group によって定義された要求/応答のプロセス間通信モデルで提供されたものと同じです。たとえば、CORBA アプリケーションの場合、トランザクション サービスは、OMG CORBA サービスのトランザクション サービス仕様で記述されているとおり、reply
チェック、commit
チェック、resume
チェックを実行します。
チェックされていないトランザクションの振る舞いは、トランザクションの整合性を提供するアプリケーションに完全に依存します。明示的な伝播を使用した場合、トランザクション サービスではチェックされたトランザクションの振る舞いを提供しないため、トランザクションの整合性は保証されません。
Oracle Tuxedo CORBA では、トランザクションを終了できるのは、そのトランザクションを作成したクライアントのみです。
注意 : | クライアントは、別のオブジェクトのサービスを要求するサーバ オブジェクトである場合もあります。 |
Oracle Tuxedo CORBA ではフラット トランザクション モデルを実装します。ネストされたトランザクションはサポートされていません。
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 システムは、障害が発生した場合にアプリケーションの実行を維持するための管理ツールを提供します。Oracle Tuxedo CORBA は、Oracle Tuxedo トランザクション管理システムで構築されるので、アプリケーションの実行を維持するための Oracle Tuxedo 機能を継承します。
Current
オブジェクトの rollback
メソッドからの戻り値は非同期的です。
その結果、ロールバックされたトランザクションに関与していた (または、参加していた) オブジェクトは、Oracle Tuxedo によってクリアされた状態を少し後で取得します。したがって、Oracle Tuxedo がこれらのオブジェクトの状態をクリアするまで、他のクライアントは、これらのオブジェクトを別のトランザクションに関与させることはできません。この状態はごく短い時間しか存在しないため、通常は製品アプリケーションで問題になることはありません。この状態に対する簡単な対策は、短時間 (通常は 1 秒) の遅延の後で適切なオペレーションを試してみることです。
NEVER
、OPTIONAL
、または ALWAYS
トランザクション ポリシーを持つサーバ オブジェクトに対する一方向のメソッド呼び出しを実行できません。
一方向のメソッド呼び出しのため、エラーまたは例外はクライアントに返されません。ただし、サーバ オブジェクトのメソッドは実行されず、適切なエラー メッセージがログに書き込まれます。クライアントは、トランザクションのコンテキスト内で、IGNORE
トランザクション ポリシーを持つサーバ オブジェクトに対する一方向のメソッド呼び出しを実行できます。この場合、サーバ オブジェクトのメソッドは実行されますが、トランザクションのコンテキスト内ではありません。トランザクション ポリシーの詳細については、『Tuxedo CORBA プログラミング リファレンス』の「実装コンフィグレーション ファイル (ICF)」を参照してください。
ここでは、実装固有のものとして CORBA のオブジェクト トランザクション サービスの一部を特に取り上げ、Oracle Tuxedo がどのように OTS を実装するかを説明します。また、トランザクションの開始、終了、中断、または再開、およびトランザクションに関する情報の取得に使用する OTS アプリケーション プログラミング インタフェース (API) について説明します。
TransactionCurrent オブジェクトを使用してトランザクション サービス API およびトランザクション サービス API の拡張 (後述) にアクセスするには、アプリケーションは、以下のオペレーションを完了する必要があります。
resolve_initial_reference("TransactionCurrent")
メソッドを呼び出します。標準 CORBA オブジェクト ポインタが返されます。この Bootstrap オブジェクトのメソッドについては、『Tuxedo CORBA プログラミング リファレンス』を参照してください。CosTransactionsCurrent::_narrow()
(C++ の場合) を発行する必要があります。
アプリケーションは、拡張を含むトランザクション サービス API を必要とする場合、上記のステップ 2 で返されたオブジェクト ポインタに対して Tobj::TransactionCurrent::_narrow()
(C++ の場合) を発行する必要があります。
Oracle Tuxedo では、サード パーティ クライアントによる CORBA Interoperable Naming Service (INS) も使用して初期トランザクション オブジェクト参照を取得することもできます。INS は、ORB::resolve_initial_references()
オペレーションを使用します。
コード リスト 2-1 では、クライアント アプリケーションが INS を使用して TransactionFactory オブジェクトに対するオブジェクト参照を取得するしくみの例を示します。完全なサンプル コードについては、University Sample のクライアント アプリケーションを参照してください。
// ORB からファクトリ ファインダを取得
CORBA::Object_var v_fact_finder_oref =
orb->resolve_initial_references("FactoryFinder");
// ファクトリ ファインダをナロー変換
Tobj::FactoryFinder_var v_fact_finder_ref =
Tobj::FactoryFinder::_narrow(v_fact_finder_oref.in());
// FactoryFinder から TransactionFactory を取得
CORBA::Object_var v_txn_fac_oref =
v_fact_finder_ref->find_one_factory_by_id(
"IDL:omg.org/CosTransactions/TransactionFactory:1.0");
// TransactionFactory オブジェクト参照をナロー変換
CosTransactions::TransactionFactory_var v_txn_fac_ref =
CosTransactions::TransactionFactory::_narrow(
v_txn_fac_oref.in());
ORB::resolve_initial_references()
オペレーションの使い方については、『Tuxedo CORBA プログラミング リファレンス』の「CORBA ブートストラップ処理のプログラミング リファレンス」を参照してください。
ここでは、Oracle Tuxedo がトランザクション サービスをサポートするために実装する CosTransactions
モジュールの CORBA ベース コンポーネントについて説明します。これらのコンポーネントの詳細については、「OMG CORBA Services Transaction Service Specification, Version 1.1」(2000 年 5 月) を参照してください。
コード リスト 2-2 には、サポートされているデータ型が示されています。
enum Status {
StatusActive,
StatusMarkedRollback,
StatusPrepared,
StatusCommitted,
StatusRolledBack,
StatusUnknown,
StatusNoTransaction,
StatusPreparing,
StatusCommitting,
StatusRollingBack
};
//この情報は、「OMG Transaction Service Specification,
// Version 1.1」(2000 年 5 月) から OMG の使用許可を得て
// 使用
コード リスト 2-3 には、サポートされている IDL コードの例外が示されています。
// ヒューリスティックな例外
exception HeuristicMixed {};
exception HeuristicHazard {};
// その他のトランザクション固有の例外
exception SubtransactionsUnavailable {};
exception NoTransaction {};
exception InvalidControl {};
exception Unavailable {};
表 2-1 には、例外が示されています。
注意 : | これらの情報は、OMG から使用許可を得て、「OMG CORBA Services Transaction Service Specification, Version 1.1」(2000 年 5 月) のものを利用しました。 |
Current
インタフェースは、トランザクション サービスのクライアントがスレッドとトランザクションの関連付けを明示的に管理できるようにするメソッドを定義します。また、Current
インタフェースは、ほとんどのアプリケーションでトランザクション サービスを簡単に使用できるようにするメソッドも定義します。これらのメソッドは、トランザクションの開始、終了、中断、再開、および現在のトランザクションに関する情報の取得に使用できます。
CosTransactions
モジュールは、Current
インタフェース (コード リスト 2-4 を参照) を定義します。
// 現在のトランザクション
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);
};
//この情報は、「OMG
Transaction Service
// Specification, Version 1.1」(2000 年 5 月) から OMG の使用許可を得て
// 使用
表 2-2 では、Current
トランザクション メソッドについて説明します。
注意 : | この情報は、OMG から使用許可を得て、「OMG CORBA Services Transaction Service Specification, Version 1.1」(2000 年 5 月) のものを利用しました。 |
SubtransactionsUnavailable 例外が発生します。トランザクション開始時にエラーが発生したためにクライアント アプリケーションをトランザクション モードに配置できない場合は、標準システム例外 INVALID_TRANSACTION が発生します。呼び出し時のコンテキストが無効な場合は、標準システム例外 BAD_INV_ORDER が発生します。
|
|||
HeuristicMixed 例外が発生します。ヒューリスティックな決定がなされたこと、関連するすべての更新の処理が不明であること、および処理が認識された更新について、すべてがコミットされたかロールバックされたことを通知するために、HeuristicHazard 例外が発生します。HeuristicMixed 例外は、HeuristicHazard 例外よりも優先されます。ヒューリスティックな例外が発生するか、オペレーションが正常に完了した場合、スレッドのトランザクション例外コンテキストは NULL に設定されます。
|
|||
begin メソッドの呼び出しによって作成されるトランザクションに関連付けられています。
set_timeout() を呼び出すと、新しいタイムアウト値が指定されます。引数 0 を付けて set_timeout() を呼び出すと、タイムアウト値がデフォルトの 300 秒に戻ります。
|
|||
TRANSACTION_ROLLEDBACK が発生し、クライアント アプリケーションに関連付けられるトランザクションはなくなります。
resume メソッドに提供できます。さらに、クライアント アプリケーションに関連付けられるトランザクションはなくなります。
|
|||
TRANSACTION_ROLLEDBACK が発生し、クライアント アプリケーションに関連付けられるトランザクションはなくなります。
INVALID_TRANSACTION が発生します。
InvalidControl 例外が発生します。
|
Control
インタフェースを使用すると、プログラムがトランザクション コンテキストを明示的に管理および伝播できるようになります。Control
インタフェースをサポートするオブジェクトは、特定のトランザクションに暗黙的に関連付けられます。
コード リスト 2-5 では、CosTransactions
モジュールで定義されている Control
インタフェースを示します。
interface Control {
Terminator get_terminator()
raises(Unavailable);
Coordinator get_coordinator()
raises(Unavailable);
};
//この情報は、「OMG
Transaction Service
// Specification, Version 1.1」(2000 年 5 月) から OMG の使用許可を得て
// 使用
Control
インタフェースは、suspend
メソッドおよび resume
メソッドでのみ使用します。
Terminator インタフェースは、トランザクションをコミットまたはロールバックするオペレーションをサポートします。通常、これらのオペレーションは、トランザクションの開始元によって使用されます。トランザクション サービスの実装は、Terminator の使用範囲を制限できます。最低で、単一スレッド内で使用できます。
コード リスト 2-6 では、Terminator インタフェースを示します。
interface Terminator {
void commit(in boolean report_heuristics)
raises(
HeuristicMixed,
HeuristicHazard
);
void rollback();
};
//この情報は、「OMG
Transaction Service
// Specification, Version 1.1」 (2000 年 5 月) から OMG の使用許可を得て
// 使用
表 2-3 では、Terminator インタフェースのメソッドを示します。
Oracle Tuxedo リリース 8.0 以降では、CosTransactions::TransactionalObject
は、トランザクションに関与することを示すオブジェクトによって使用されなくなりました。インタフェースが TransactionalObject から継承され、ICF が異なるトランザクション ポリシーを示している場合、警告が発行されます。TransactionalObject は、ほかの目的には使用されません。オブジェクトをトランザクションに関与させるために設定する必要があるトランザクション ポリシーの詳細については、『Tuxedo CORBA プログラミング リファレンス』の「実装コンフィグレーション ファイル (ICF)」を参照してください。
CosTransactions
モジュールは、TransactionalObject
インタフェース (コード リスト 2-7 を参照) を定義します。このインタフェースで定義されるメソッドはありません。単にマーカとして使用されます。
interface TransactionalObject {
};
//この情報は、「OMG
Transaction Service
// Specification, Version 1.1」(2000 年 5 月) から OMG の使用許可を得て
// 使用
TransactionFactory
インタフェースは、トランザクションの開始元がトランザクションを開始できるようにするためのものです。このインタフェースは、最上位トランザクションの新しい表現を作成する、作成と再作成の 2 つのオペレーションを定義します。TransactionFactory は、ORB インタフェースの resolve_initial_reference()
オペレーションではなく、ライフ サイクル サービスの FactoryFinder
インタフェースを使用して検索します。
コード リスト 2-8 では、TransactionFactory
インタフェースを示します。
注意 : | TransactionFactory インタフェースの Control recreate メソッドはサポートされていません。 |
interface TransactionFactory {
Control create(in unsigned long time_out);
Control recreate(in PropagationContext ctx);
};
//この情報は、「OMG
Transaction Service
// Specification, Version 1.1」(2000 年 5 月) から OMG の使用許可を得て
// 使用
表 2-4 では、TransactionFactory
インタフェースのメソッドを示します。
その他の CORBA のオブジェクト トランザクション サービス インタフェースはサポートされていません。前述の Current
インタフェースは、Bootstrap オブジェクトから取得した場合にのみサポートされます。前述の Control
インタフェースは、Current オブジェクトの get_control
メソッドおよび suspend
メソッドで取得した場合にのみサポートされます。
ここでは、前述の CORBA のオブジェクト トランザクション サービス API の特定の拡張について説明します。ここで説明する API を使用すると、アプリケーションは、Open Group リソース マネージャを開く、または閉じることができるようになります。
以下の API は、2 フェーズ コミット プロトコルを Open Group の XA インタフェースで制御できるようにすることで、リソース マネージャが簡単に分散トランザクションに関与できるようにします。
以下の定義とインタフェースは、Tobj
モジュールで定義されます。
要求により、リソース マネージャを開く、または閉じる際に失敗したことを通知するために例外が発生します。
このインタフェースは、CosTransactions
モジュールの Current
インタフェースのすべてのメソッドをサポートしています。これについては、『Tuxedo CORBA プログラミング リファレンス』の「CORBA ブートストラップ処理のプログラミング リファレンス」で説明しています。さらに、このインタフェースは、リソース マネージャを開く、または閉じる API をサポートしています。
コード リスト 2-9 では、Tobj
モジュールで定義されている TransactionCurrent
インタフェースを示します。
Interface TransactionCurrent: CosTransactions::Current {
void open_xa_rm()
raises(RMfailed);
void close_xa_rm()
raises(Rmfailed);
}
表 2-5 では、リソース マネージャ固有の API を説明しています。これらの API の詳細については、『Tuxedo CORBA プログラミング リファレンス』を参照してください。
Oracle Tuxedo CORBA クライアント/サーバ アプリケーションにトランザクションを統合する場合は、以下のガイドライン考慮してください。
CORBA::OBJ_ADAPTER
トランザクション内にあるクライアントが、現在別のトランザクション内にあるオブジェクトに対してオペレーションを呼び出そうとすると、以下のエラー メッセージが発行されます。
CORBA::INVALID_TRANSACTION
Tobj_ServantBase::deactivate_object()
オペレーションですべての状態を処理することを検討してください。トランザクションの結果は、deactivate_object()
の呼び出し時に認識されるので、これによって、オブジェクトは状態を正しくかつ簡単に処理できるようになります。always
を割り当てたオブジェクトが、クライアント アプリケーションではなく Oracle Tuxedo システムで開始されたトランザクションに関与している場合は、以下に注意してください。OBJ_ADAPTER
例外を受け取ります。この場合、Oracle Tuxedo システムは、トランザクションをロールバックします。ただし、クライアント アプリケーションは、トランザクションが Oracle Tuxedo ドメインでスコープ指定されていないことをまったく認識していません。
表 2-6 では、UserTransaction オブジェクトのメソッドを示します。
表 2-7 では、UserTransaction オブジェクトのメソッドが送出する例外を示します。