|
ここでは、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ドメイン・コンポーネントの使い方』を参照してください。
クライアント・アプリケーションは、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トランザクション・ポリシーを持つサーバー・オブジェクトに対する一方向のメソッド呼出しを実行できます。この場合、サーバー・オブジェクトのメソッドは実行されますが、トランザクションのコンテキスト内ではありません。トランザクション・ポリシーの詳細は、CORBAプログラミング・リファレンスの実装構成ファイル(ICF)に関する項を参照してください。
ここでは、実装固有のものとしてCORBAのオブジェクト・トランザクション・サービスの一部を特に取り上げ、Oracle TuxedoがどのようにOTSを実装するかを説明します。 また、トランザクションの開始、終了、中断、または再開、およびトランザクションに関する情報の取得に使用するOTSアプリケーション・プログラミング・インタフェース(API)について説明します。
TransactionCurrentオブジェクトを使用してトランザクション・サービスAPIおよびトランザクション・サービスAPIの拡張(後述)にアクセスするには、アプリケーションは、以下のオペレーションを完了する必要があります。
resolve_initial_reference("TransactionCurrent")メソッドを呼び出します。 標準CORBAオブジェクト・ポインタが返されます。 このBootstrapオブジェクトのメソッドについては、『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のクライアント・アプリケーションを参照してください。
// 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には、サポートされているデータ型が示されています。
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コードの例外が示されています。
// Heuristic exceptions
exception HeuristicMixed {};
exception HeuristicHazard {};
// Other transaction-specific exceptions
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を参照)を定義します。
// 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 OMGTransaction Service
// Specification, Version 1.1, May 2000. Used with permission
// of the 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メソッドの呼出しによって作成されるトランザクションに関連付けられています。
トランザクション・タイムアウトの初期値は300秒です。0より大きい引数値を付けて
set_timeout()を呼び出すと、新しいタイムアウト値が指定されます。引数0を付けてset_timeout()を呼び出すと、タイムアウト値がデフォルトの300秒に戻ります。
|
|||
|
関連付けられているトランザクションが、可能なトランザクションの結果のみをロールバックする状態にある場合、標準システム例外
TRANSACTION_ROLLEDBACKが発生し、クライアント・アプリケーションに関連付けられるトランザクションはなくなります。
それ以外の場合、クライアント・アプリケーションに関連付けられているトランザクション・コンテキストを表すオブジェクトが返されます。同じクライアントは、このコンテキストを再確立するために、このオブジェクトを
resumeメソッドに提供できます。さらに、クライアント・アプリケーションに関連付けられるトランザクションはなくなります。
|
|||
クライアントにすでに関連付けられているトランザクションが、可能なトランザクションの結果のみをロールバックする状態にある場合、標準システム例外
TRANSACTION_ROLLEDBACKが発生し、クライアント・アプリケーションに関連付けられるトランザクションはなくなります。
呼出し側が、1つまたは複数のリソース・マネージャとグローバル・トランザクション外の作業に関与しているため、システムがグローバル・トランザクションを再開できない場合、標準システム例外
INVALID_TRANSACTIONが発生します。
パラメータがNULLオブジェクト参照の場合、クライアント・アプリケーションに関連付けられるトランザクションはなくなります。現在の実行環境でパラメータが有効な場合、クライアント・アプリケーションは、(以前のトランザクションにかわって)そのトランザクションに関連付けられます。それ以外の場合、
InvalidControl例外が発生します。
|
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 OMGTransaction Service
// Specification, Version 1.1, May 2000. Used with permission
// of the OMG.
表2-3では、Terminatorインタフェースのメソッドを示します。
Oracle Tuxedoリリース8.0以降では、CosTransactions::TransactionalObjectは、トランザクションに関係することを示すオブジェクトによって使用されなくなりました。インタフェースがTransactionalObjectから継承され、ICFが異なるトランザクション・ポリシーを示している場合、警告が発行されます。TransactionalObjectは、他の目的には使用されません。オブジェクトをトランザクションに関係させるために設定する必要があるトランザクション・ポリシーの詳細は、CORBAプログラミング・リファレンスの実装構成ファイル(ICF)に関する項を参照してください。
CosTransactionsモジュールは、TransactionalObjectインタフェース(リスト2-7を参照)を定義します。 このインタフェースで定義されるメソッドはありません。単にマーカーとして使用されます。
interface TransactionalObject {
};
// This information was taken from the OMG Transaction Service
// Specification, Version 1.1, May 2000. Used with permission
// of the 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);
};
// This information was taken from the OMG Transaction Service
// Specification, Version 1.1, May 2000. Used with permission
// of the 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インタフェースのすべてのメソッドをサポートしており、CORBAプログラミング・リファレンスのC++ブートストラップ処理オブジェクトのプログラミング・リファレンスに関する項で説明されています。さらに、このインタフェースは、リソース・マネージャをオープン、またはクローズする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の詳細は、『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オブジェクトのメソッドがスローする例外を示します。
|