Tuxedo CORBA トランザクション

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

トランザクション サービス

ここでは、以下の内容について説明します。

ここでは、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 実装は、実際のトランザクションの調整をサーバ上のトランザクション マネージャに委譲します。

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 のみ)

CORBA アプリケーションの場合、OMG CORBA サービスのトランザクション サービス仕様で、クライアントがトランザクション コンテキストの伝播を暗黙的にするか明示的にするかを選択できることが規定されています。Oracle Tuxedo では、暗黙的な伝播を提供します。明示的な伝播はできる限り使用しないでください。

明示的なトランザクションの伝播を使用して渡されるトランザクション コンテキストに関連付けられたオブジェクトは、暗黙的なトランザクション伝播 API と混在しないようにしてください。ただし、明示的な伝播は、トランザクション メソッドが処理可能な場合に対してはどのような制約も課しません。トランザクションをコミットする前にすべてのトランザクション メソッドが完了するかどうかは保証できません。

トランザクションの整合性

チェックされたトランザクションの振る舞いでは、トランザクションに必要な、トランザクションに関与するすべてのオブジェクトがトランザクションに関する要求を完了するまで commit が成功しないようにすることでトランザクションの整合性を提供します。暗黙的なトランザクションの伝播を使用する場合、トランザクション サービスは、チェックされたトランザクションの振る舞いを提供します。このトランザクションの振る舞いは、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 システムは、障害が発生した場合にアプリケーションの実行を維持するための管理ツールを提供します。Oracle Tuxedo CORBA は、Oracle Tuxedo トランザクション管理システムで構築されるので、アプリケーションの実行を維持するための Oracle Tuxedo 機能を継承します。

全般的な制限事項

トランザクション サービスには、以下の制限があります。

 


CORBA アプリケーションのトランザクション サービス

ここでは、以下の内容について説明します。

ここでは、実装固有のものとして CORBA のオブジェクト トランザクション サービスの一部を特に取り上げ、Oracle Tuxedo がどのように OTS を実装するかを説明します。また、トランザクションの開始、終了、中断、または再開、およびトランザクションに関する情報の取得に使用する OTS アプリケーション プログラミング インタフェース (API) について説明します。

Bootstrap オブジェクトを使用した TransactionCurrent オブジェクトへの初期リファレンスの取得

TransactionCurrent オブジェクトを使用してトランザクション サービス API およびトランザクション サービス API の拡張 (後述) にアクセスするには、アプリケーションは、以下のオペレーションを完了する必要があります。

  1. Bootstrap オブジェクトを作成します。Bootstrap オブジェクトの作成方法の詳細については、『Tuxedo CORBA プログラミング リファレンス』の「CORBA ブートストラップ処理のプログラミング リファレンス」を参照してください。
  2. Bootstrap オブジェクトの resolve_initial_reference("TransactionCurrent") メソッドを呼び出します。標準 CORBA オブジェクト ポインタが返されます。この Bootstrap オブジェクトのメソッドについては、『Tuxedo CORBA プログラミング リファレンス』を参照してください。
  3. アプリケーションは、トランザクション サービス API のみを必要とする場合、上記のステップ 2 で返されたオブジェクト ポインタに対して CosTransactionsCurrent::_narrow() (C++ の場合) を発行する必要があります。
  4. アプリケーションは、拡張を含むトランザクション サービス 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 を使用したクライアント アプリケーションのサンプル コード
// 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 ブートストラップ処理のプログラミング リファレンス」を参照してください。

CORBA トランザクション サービス API

ここでは、以下の内容について説明します。

ここでは、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
};
// この情報は、「OMG Transaction Service Specification,
// Version 1.1」(2000 年 5 月) から OMG の使用許可を得て
// 使用

例外

コード リスト 2-3 には、サポートされている IDL コードの例外が示されています。

コード リスト 2-3 トランザクション サービスでサポートされている例外
// ヒューリスティックな例外
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 月) のものを利用しました。

表 2-1 トランザクション サービスでサポートされている例外
例外
説明
HeuristicMixed
ヒューリスティックな決定がなされたこと、関連する更新の一部がコミットされ、ほかはロールバックされたことを通知するために、要求に対してこの例外が発生します。
HeuristicHazard
ヒューリスティックな決定がなされたこと、関連するすべての更新の処理が不明であること、および処理が認識された更新について、すべてがコミットされたかロールバックされたことを通知するために、要求に対してこの例外が発生します。したがって、HeuristicMixed 例外は、HeuristicHazard 例外よりも優先されます。
SubtransactionsUnavailable
クライアントに既に関連するトランザクションがある場合、Current インタフェースの begin メソッドに対して、この例外が発生します。
NoTransaction
クライアント アプリケーションに関連付けられているトランザクションがない場合、Current インタフェースの rollback および rollback_only メソッドに対して、この例外が発生します。
InvalidControl
パラメータが現在の実行環境で有効ではない場合、Current インタフェースの resume メソッドに対して、この例外が発生します。
Unavailable
Control インタフェースが要求されたオブジェクトを提供できない場合、Control インタフェースの get_terminator メソッドと get_coordinator メソッドに対して、この例外が発生します。

Current インタフェース

Current インタフェースは、トランザクション サービスのクライアントがスレッドとトランザクションの関連付けを明示的に管理できるようにするメソッドを定義します。また、Current インタフェースは、ほとんどのアプリケーションでトランザクション サービスを簡単に使用できるようにするメソッドも定義します。これらのメソッドは、トランザクションの開始、終了、中断、再開、および現在のトランザクションに関する情報の取得に使用できます。

CosTransactions モジュールは、Current インタフェース (コード リスト 2-4 を参照) を定義します。

コード リスト 2-4 Current インタフェース IDL
// 現在のトランザクション 
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 月) のものを利用しました。

表 2-2 Current オブジェクトのトランザクション メソッド
メソッド
説明
begin
新しいトランザクションを作成します。スレッドが新しいトランザクションに関連付けられるように、クライアント アプリケーションのトランザクション コンテキストが変更されます。クライアント アプリケーションが既にトランザクションに関連付けられている場合は、SubtransactionsUnavailable 例外が発生します。トランザクション開始時にエラーが発生したためにクライアント アプリケーションをトランザクション モードに配置できない場合は、標準システム例外 INVALID_TRANSACTION が発生します。呼び出し時のコンテキストが無効な場合は、標準システム例外 BAD_INV_ORDER が発生します。
commit
クライアント アプリケーションに関連付けられているトランザクションがない場合は、NoTransaction 例外が発生します。
呼び出し時のコンテキストが無効な場合は、標準システム例外 BAD_INV_ORDER が発生します。
システムでトランザクションのロールバックを決定すると、標準例外 TRANSACTION_ROLLEDBACK が発生し、スレッドのトランザクション コンテキストが NULL に設定されます。
ヒューリスティックな決定がなされたこと、関連する更新の一部がコミットされ、ほかはロールバックされたことを通知するために、HeuristicMixed 例外が発生します。ヒューリスティックな決定がなされたこと、関連するすべての更新の処理が不明であること、および処理が認識された更新について、すべてがコミットされたかロールバックされたことを通知するために、HeuristicHazard 例外が発生します。HeuristicMixed 例外は、HeuristicHazard 例外よりも優先されます。ヒューリスティックな例外が発生するか、オペレーションが正常に完了した場合、スレッドのトランザクション例外コンテキストは NULL に設定されます。
オペレーションが正常に完了した場合、スレッドのトランザクション コンテキストは NULL に設定されます。
rollback
クライアント アプリケーションに関連付けられているトランザクションがない場合は、NoTransaction 例外が発生します。
呼び出し時のコンテキストが無効な場合は、標準システム例外 BAD_INV_ORDER が発生します。
オペレーションが正常に完了した場合、スレッドのトランザクション コンテキストは NULL に設定されます。
rollback_only
クライアント アプリケーションに関連付けられているトランザクションがない場合は、NoTransaction 例外が発生します。それ以外の場合、トランザクションの可能な結果のみがロールバックされるように、クライアント アプリケーションに関連付けられているトランザクションが変更されます。
get_status
クライアント アプリケーションに関連付けられているトランザクションがない場合は、StatusNoTransaction 値が返されます。それ以外の場合、このメソッドは、クライアント アプリケーションに関連付けられているトランザクションのステータスを返します。
get_transaction_name
クライアント アプリケーションに関連付けられているトランザクションがない場合は、空の文字列が返されます。それ以外の場合、このメソッドは、トランザクションを説明する出力可能な文字列 (特に、Open Group で指定されている XID) を返します。返された文字列は、デバッグ時のサポートを目的としています。
set_timeout
このメソッドは、タイムアウト値に影響を与える対象オブジェクトに関連付けられている状態変数を変更します。タイムアウト値は、その後の begin メソッドの呼び出しによって作成されるトランザクションに関連付けられています。
トランザクション タイムアウトの初期値は 300 秒です。0 より大きい引数値を付けて set_timeout() を呼び出すと、新しいタイムアウト値が指定されます。引数 0 を付けて set_timeout() を呼び出すと、タイムアウト値がデフォルトの 300 秒に戻ります。
set_timeout() を呼び出すと、その後の begin の呼び出しで作成されたトランザクションは、指定した作成後の秒数が経過するまでに完了しなかった場合にロールバックの対象になります。

注意 : トランザクション タイムアウトの初期値は 300 秒です。begin メソッドを使用せずに、AUTOTRAN を介してトランザクションを開始した場合、タイムアウト値は、Oracle Tuxedo コンフィグレーション ファイルの TRANTIME パラメータで指定した値です。詳細については、「トランザクションの管理」を参照してください。

get_control
クライアントがトランザクションに関連付けられていない場合は、NULL オブジェクト参照が返されます。それ以外の場合、クライアント アプリケーションに関連付けられているトランザクション コンテキストを表す Control オブジェクトが返されます。このオブジェクトは、このコンテキストを再確立するために resume メソッドに提供できます。
suspend
クライアント アプリケーションがトランザクションに関連付けられていない場合は、NULL オブジェクト参照が返されます。
関連付けられているトランザクションが、可能なトランザクションの結果のみをロールバックする状態にある場合、標準システム例外 TRANSACTION_ROLLEDBACK が発生し、クライアント アプリケーションに関連付けられるトランザクションはなくなります。
呼び出し時のコンテキストが無効な場合は、標準システム例外 BAD_INV_ORDER が発生します。トランザクションに関する呼び出し側の状態は変化しません。
それ以外の場合、クライアント アプリケーションに関連付けられているトランザクション コンテキストを表すオブジェクトが返されます。同じクライアントは、このコンテキストを再確立するために、このオブジェクトを resume メソッドに提供できます。さらに、クライアント アプリケーションに関連付けられるトランザクションはなくなります。

注意 : 「The Common Object Request Broker: Architecture and Specification, Revision 2.4」にあるとおり、標準システム例外 TRANSACTION_ROLLEDBACK は、要求に関連付けられているトランザクションが既にロールバックされているか、ロールバックとしてマークされていることを示します。したがって、トランザクションの代わりに実行される処理は無効になるので、要求されたメソッドが実行できなかったか、実行されなかったことを示します。

resume
クライアントに既に関連付けられているトランザクションが、可能なトランザクションの結果のみをロールバックする状態にある場合、標準システム例外 TRANSACTION_ROLLEDBACK が発生し、クライアント アプリケーションに関連付けられるトランザクションはなくなります。
呼び出し時のコンテキストが無効な場合は、標準システム例外 BAD_INV_ORDER が発生します。
呼び出し側が、1 つまたは複数のリソース マネージャとグローバル トランザクション外の作業に関与しているため、システムがグローバル トランザクションを再開できない場合、標準システム例外 INVALID_TRANSACTION が発生します。
パラメータが NULL オブジェクト参照の場合、クライアント アプリケーションに関連付けられるトランザクションはなくなります。現在の実行環境でパラメータが有効な場合、クライアント アプリケーションは、(以前のトランザクションに代わって) そのトランザクションに関連付けられます。それ以外の場合、InvalidControl 例外が発生します。

注意 : 標準システム例外 TRANSACTION_ROLLEDBACK の定義については、suspend を参照してください。

Control インタフェース

Control インタフェースを使用すると、プログラムがトランザクション コンテキストを明示的に管理および伝播できるようになります。Control インタフェースをサポートするオブジェクトは、特定のトランザクションに暗黙的に関連付けられます。

コード リスト 2-5 では、CosTransactions モジュールで定義されている Control インタフェースを示します。

コード リスト 2-5 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 インタフェースは、トランザクションをコミットまたはロールバックするオペレーションをサポートします。通常、これらのオペレーションは、トランザクションの開始元によって使用されます。トランザクション サービスの実装は、Terminator の使用範囲を制限できます。最低で、単一スレッド内で使用できます。

コード リスト 2-6 では、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 インタフェースのメソッドを示します。

表 2-3 Termination インタフェースのメソッド
メソッド
説明
commit
トランザクションが rollback only としてマークされておらず、トランザクションのすべての参加リソースがコミットに同意した場合、トランザクションはコミットされ、オペレーションは正常に終了します。それ以外の場合、トランザクションはロールバックされ (下記の rollback メソッドを参照)、標準例外 TRANSACTION_ROLLEDBACK が発生します。
report_heuristics パラメータが true の場合、トランザクション サービスは、HeuristicMixed 例外と HeuristicHazard 例外を使用して、矛盾している (またはその可能性がある) 結果を通知します。トランザクション サービスの実装では、オプションの CORBA ノーティフィケーション サービスを使用すると、ヒューリスティックな決定をレポートできます。
コミットまたはロールバックされていないトランザクションのサブトランザクションがある場合、または完了していないトランザクションに関連付けられている (あるいはその可能性がある) アクティビティがある場合、commit オペレーションはトランザクションをロールバックできます。このようなエラー チェックの性質と程度は、実装によって異なります。最上位トランザクションがコミットされると、回復可能なオブジェクトに対する、このトランザクションの範囲内の変更は確定され、他のトランザクションまたはクライアントでも認識可能なものになります。サブトランザクションがコミットされた場合は、リソースで適用された独立性の程度に応じて、ほかの関連するトランザクションでも変更が認識可能になります。
rollback
トランザクションをロールバックします。
トランザクションがロールバックされると、回復可能なオブジェクトに対する、このトランザクションの範囲内の変更 (下位トランザクションによる変更も含む) がロールバックされます。トランザクションでロックされたすべてのリソースは、リソースで適用された独立性の程度に応じて、ほかの関連するトランザクションで使用可能になります。

TransactionalObject インタフェース

Oracle Tuxedo リリース 8.0 以降では、CosTransactions::TransactionalObject は、トランザクションに関与することを示すオブジェクトによって使用されなくなりました。インタフェースが TransactionalObject から継承され、ICF が異なるトランザクション ポリシーを示している場合、警告が発行されます。TransactionalObject は、ほかの目的には使用されません。オブジェクトをトランザクションに関与させるために設定する必要があるトランザクション ポリシーの詳細については、『Tuxedo CORBA プログラミング リファレンス』の「実装コンフィグレーション ファイル (ICF)」を参照してください。

CosTransactions モジュールは、TransactionalObject インタフェース (コード リスト 2-7 を参照) を定義します。このインタフェースで定義されるメソッドはありません。単にマーカとして使用されます。

コード リスト 2-7 TransactionalObject インタフェース
interface TransactionalObject {
};
// この情報は、「OMG Transaction Service
// Specification
, Version 1.1」(2000 年 5 月) から 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);
};
// この情報は、「OMG Transaction Service
// Specification
, Version 1.1」(2000 年 5 月) から OMG の使用許可を得て
// 使用

表 2-4 では、TransactionFactory インタフェースのメソッドを示します。

表 2-4 TransactionFactory インタフェースのメソッド
メソッド
説明
create
新しい最上位トランザクションを作成し、Control オブジェクトを返します。Control オブジェクトは、新しいトランザクションヘの参加を管理または制御する際に使用できます。トランザクション サービスの実装は、Control オブジェクトの機能を制限し、他の実行環境に送信し、そこで使用できるようにすることができます。最低で、クライアント アプリケーションで使用できます。
パラメータが 0 以外の値 n の場合、新しいトランザクションは、n 秒が経過するまでに完了しなかったときにロールバックの対象になります。パラメータが 0 の場合、アプリケーション指定のタイムアウトは設定されません。
recreate
サポートされていません。

その他の CORBA のオブジェクト トランザクション サービス インタフェース

その他の CORBA のオブジェクト トランザクション サービス インタフェースはサポートされていません。前述の Current インタフェースは、Bootstrap オブジェクトから取得した場合にのみサポートされます。前述の Control インタフェースは、Current オブジェクトの get_control メソッドおよび suspend メソッドで取得した場合にのみサポートされます。

CORBA トランザクション サービス API の拡張

ここでは、前述の CORBA のオブジェクト トランザクション サービス API の特定の拡張について説明します。ここで説明する API を使用すると、アプリケーションは、Open Group リソース マネージャを開く、または閉じることができるようになります。

以下の API は、2 フェーズ コミット プロトコルを Open Group の XA インタフェースで制御できるようにすることで、リソース マネージャが簡単に分散トランザクションに関与できるようにします。

以下の定義とインタフェースは、Tobj モジュールで定義されます。

例外

以下の例外がサポートされています。

exception RMfailed {};

要求により、リソース マネージャを開く、または閉じる際に失敗したことを通知するために例外が発生します。

TransactionCurrent インタフェース

このインタフェースは、CosTransactions モジュールの Current インタフェースのすべてのメソッドをサポートしています。これについては、『Tuxedo CORBA プログラミング リファレンス』の「CORBA ブートストラップ処理のプログラミング リファレンス」で説明しています。さらに、このインタフェースは、リソース マネージャを開く、または閉じる 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 の詳細については、『Tuxedo CORBA プログラミング リファレンス』を参照してください。

表 2-5 Current インタフェースのリソース マネージャの API
メソッド
説明
open_xa_rm
このメソッドは、このプロセスがリンクされている Open Group のリソース マネージャを開きます。リソース マネージャを開いているときに障害が発生すると、RMfailed 例外が発生します。
リモート クライアントまたはネイティブ クライアントでこのメソッドを呼び出そうとすると、標準システム例外 NO_IMPLEMENT が発生します。
close_xa_rm
このメソッドは、このプロセスがリンクされている Open Group のリソース マネージャを閉じます。リソース マネージャを閉じているときに障害が発生すると、RMfailed 例外が発生します。関数呼び出し時のコンテキストが無効な場合 (呼び出し側がトランザクション モードの場合など) は、標準システム例外 BAD_INV_ORDER が発生します。
リモート クライアントまたはネイティブ クライアントでこのメソッドを呼び出そうとすると、標準システム例外 NO_IMPLEMENT が発生します。

Oracle Tuxedo CORBA アプリケーションのトランザクションの使用に関する注意事項

Oracle Tuxedo CORBA クライアント/サーバ アプリケーションにトランザクションを統合する場合は、以下のガイドライン考慮してください。

 


UserTransaction API

ここでは、以下の内容について説明します。

UserTransaction メソッド

表 2-6 では、UserTransaction オブジェクトのメソッドを示します。

表 2-6 UserTransaction オブジェクトのメソッド
メソッド名
説明
begin
現在のスレッドでトランザクションを開始します。
commit
現在のスレッドに関連付けられているトランザクションをコミットします。
getStatus
トランザクション ステータスを返します。現在のスレッドに関連付けられているトランザクションがない場合は、STATUS_NO_TRANSACTION を返します。
トランザクション ステータスは、以下のいずれかの値です。
  • STATUS_ACTIVE
  • STATUS_COMMITTED
  • STATUS_COMMITTING
  • STATUS_MARKED_ROLLBACK
  • STATUS_NO_TRANSACTION
  • STATUS_PREPARED
  • STATUS_PREPARING
  • STATUS_ROLLEDBACK
  • STATUS_ROLLING_BACK
  • STATUS_UNKNOWN
rollback
現在のスレッドに関連付けられているトランザクションをロールバックします。
setRollbackOnly
トランザクションの可能な結果のみがロールバックされるように、現在のスレッドに関連付けられているトランザクションをマークします。
setTransactionTimeout
begin メソッドで現在のスレッドが開始したトランザクションのタイムアウト値を指定します。アプリケーションが begin メソッドを呼び出していない場合、トランザクション サービスは、トランザクション タイムアウトのデフォルト値を使用します。

UserTransaction メソッドが送出する例外

表 2-7 では、UserTransaction オブジェクトのメソッドが送出する例外を示します。

表 2-7 UserTransaction メソッドが送出する例外
例外
説明
HeuristicMixedException
ヒューリスティックな決定がなされたこと、関連する更新の一部がコミットされ、ほかはロールバックされたことを通知するために送出されます。
HeuristicRollbackException
ヒューリスティックな決定がなされたこと、関連する更新の一部がロールバックされたことを通知するために送出されます。
NotSupportedException
ネストされたトランザクションなど、要求されたオペレーションがサポートされていないときに送出されます。
RollbackException
トランザクションが rollback only としてマークされているか、トランザクションがコミットではなくロールバックされたときに送出されます。
IllegalStateException
現在のスレッドがトランザクションに関連付けられていない場合に送出されます。
SecurityException
スレッドによるトランザクションのコミットが認められないことを通知するために送出されます。
SystemException
トランザクション マネージャで予期しないエラーが発生し、以降のトランザクション サービスを続行できなくなったことを示すために、トランザクション マネージャによって送出されます。


  ページの先頭       前  次