|
ここでは、Oracle Tuxedo CORBA ソフトウェアの CORBA C++ クライアント アプリケーションでトランザクションを使用する方法を説明します。始める前に、「トランザクションについて」を読む必要があります。
注意 : | 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 オンライン マニュアルの「Transactions サンプル アプリケーション」を参照してください。TransactionCurrent オブジェクトの概要については、『Tuxedo CORBA クライアント アプリケーションの開発方法』の「クライアント アプリケーションの開発概念」を参照してください。
クライアント アプリケーションは、トランザクション処理を使用してデータの有効性、一貫性、永続性を保証します。Oracle Tuxedo ソフトウェアのトランザクションを使用すると、クライアント アプリケーションはトランザクションを開始および終了し、トランザクションのステータスを取得できます。Oracle Tuxedo ソフトウェアでは、CORBA のオブジェクト トランザクション サービスで定義されたトランザクションを使いやすいように拡張して使用します。
トランザクションは、インタフェースで定義されます。アプリケーション設計者は、Oracle Tuxedo クライアント/サーバ アプリケーション内のどのインタフェースでトランザクションを処理するかを指定します。実装コンフィグレーション・ファイル (ICF) で、トランザクション ポリシーがサーバ アプリケーション用に定義されます。一般に、使用可能なインタフェースの ICF ファイルは、アプリケーション設計者からクライアント プログラムに提供されます。
トランザクションをクライアント アプリケーションに追加するには、以下の手順を実行します。
以下の節では、Transactions University サンプル アプリケーションにあるクライアント アプリケーションの一部を使用して、この手順を説明します。Transactions University サンプル アプリケーションの詳細については、Oracle Tuxedo オンライン マニュアルの「Transactions サンプル アプリケーション」を参照してください。
Transactions University サンプル アプリケーションは、Oracle Tuxedo ソフトウェア キットの次のディレクトリにあります。
Oracle Tuxedo CORBA クライアント ソフトウェアを使用している場合、Bootstrap オブジェクトを使用し、指定した Oracle Tuxedo ドメインで TransactionCurrent オブジェクトへのオブジェクト参照を取得します。TransactionCurrent オブジェクトの詳細については、『Tuxedo CORBA クライアント アプリケーションの開発方法』の「クライアント アプリケーションの開発概念」を参照してください。
注意 : | サード パーティのクライアント ORB を使用している場合、CORBA Interoperable Naming Service (INS) の CORBA::ORB::resolve_initial_references オペレーションを使用して、Oracle Tuxedo ドメインの FactoryFinder オブジェクトへのオブジェクト参照を取得します。INS を使用してトランザクション クライアントの初期オブジェクト参照を取得する方法の詳細については、『Tuxedo CORBA プログラミング リファレンス』の「CORBA ブートストラップ処理のプログラミング リファレンス」を参照してください。 |
注意 : | 次の C++ の例は、Bootstrap オブジェクトを使用して TransactionCurrent オブジェクトを返す方法を示します。 |
CORBA::Object_var var_transaction_current_oref =
Bootstrap.resolve_initial_references(“TransactionCurrent”);
CosTransactions::Current_var transaction_current_oref=
CosTransactions::Current::_narrow(
var_transaction_current_oref.in());
TransactionCurrent オブジェクトには、クライアント アプリケーションでトランザクションを管理できるようにするメソッドがあります。これらのメソッドを使用すると、トランザクションを開始および終了して、現在のトランザクションに関する情報を取得できます。
表 4-1 では、TransactionCurrent オブジェクトのメソッドについて説明します。
begin メソッドで明示的に開始するのではなく、トランザクションが自動的に開始した場合、タイムアウト値は、UBBCONFIG ファイルの TRANTIME パラメータで指定した値です。TRANTIME パラメータの設定については、「トランザクションの管理」を参照してください。
|
|
Tobj::TransactionCurrent::begin
メソッドを使用してトランザクションを開始します。このメソッドは値を返しません。Tobj::TransactionCurrent::commit
メソッドを使用すると、現在のトランザクションがコミットされます。このメソッドは、トランザクションを終了して、オペレーションの処理を開始します。トランザクションは、トランザクションのすべての参加リソースがコミットに同意した場合にのみコミットされます。
トランザクションとクライアント アプリケーションの関連付けは、アプリケーションが Tobj::TransactionCurrent::commit
メソッドまたは Tobj::TransactionCurrent::rollback
メソッドを呼び出したときに解除されます。次の C++ の例は、クラスに登録している生徒のオペレーションをカプセル化するためにトランザクションを使用する場合を示しています。
// トランザクションを開始
transaction_current_oref->begin();
try {
// トランザクション内でオペレーションを実行
pointer_Registar_ref->register_for_courses(student_id, course_number_list);
...
// オペレーションがエラーなしで実行された場合は、トランザクションをコミット
CORBA::Boolean report_heuristics = CORBA_TRUE;
transaction_current_ref->commit(report_heuristics);
}
catch (CORBA::Exception &) {
// オペレーションで実行エラーが発生した場合は、トランザクションをロールバック
// 次に元の例外を再び送出する
// ロールバックが失敗した場合、例外を無視し、
// 元の例外を再び送出する
try {
transaction_current_ref->rollback();
}
catch (CORBA::Exception &) {
TP::userlog("rollback failed");
throw;
}