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 アプリケーションのトランザクションの概要

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

トランザクションの ACID 特性

Oracle Tuxedo システムの最も基本的な機能の 1 つが、トランザクション管理です。トランザクションは、データベース トランザクションが誤りなく完了し、高性能トランザクションのすべての ACID 特性 (原子性、一貫性、独立性、および持続性) が確保されるようにする手段です。Oracle Tuxedo は、完全なインフラストラクチャを提供することでトランザクションの整合性を保護し、さまざまなリソース マネージャ (RM) にわたってデータベースが正しく更新されるようにします。いずれか 1 つのオペレーションが失敗した場合、一連のオペレーションがすべてロールバックされます。

リソース マネージャ

リソース マネージャ (RM) は、データベース管理システムや Oracle Tuxedo システムの Application Queuing Manager のようなデータ リポジトリであり、データにアクセスするためのツールを備えています。Oracle Tuxedo システムは、1 つまたは複数の RM を使用してアプリケーションの状態を管理します。たとえば、銀行の預金残高のレコードは、RM に保存されています。預金引き出しサービスによってアプリケーションの状態が変わると、変更後の預金残高が、適切な RM に記録されます。

Oracle Tuxedo システムは、XA インタフェース対応の RM が関与するトランザクションを管理するのに役立ちます。Oracle Tuxedo システムは、トランザクション マネージャ (TM: Transaction Manager) として動作し、トランザクションに関連するすべての操作およびすべてのモジュールを調整します。

TM は、システム全体に渡るリソースが関与するグローバル トランザクションを調整します。個々のリソースは、ローカルのリソース マネージャ (RM) によって管理されます。トランザクション マネージャ サーバ (TMS: Transaction Manager Server) は、複数のリソースに関与するトランザクションの開始、コミット、およびアボートを行います。アプリケーション コードは、RM に対して標準の埋め込み型 SQL インタフェースを使用し、読み取りや更新を行います。TMS は、RM に対して XA インタフェースを使用し、グローバル トランザクション操作を実行します。

サポートされているプログラミング モデル

Oracle Tuxedo は、「The Common Object Request Broker: Architecture and Specification, Revision 2.4.2」(2001 年 1 月) に準拠し、C++ による Object Management Group の Common Object Request Broker (CORBA) をサポートします。

サポートされている API モデル

Oracle Tuxedo は、CORBA のオブジェクト トランザクション サービス (OTS) をサポートしています。Oracle Tuxedo は、OTS に対する C++ インタフェースを提供し、OTS に基づいています。OTS には、環境オブジェクト org.omg.CosTransactions.Current を介してアクセスします。環境オブジェクト TransactionCurrent の使用方法については、『Tuxedo CORBA プログラミング リファレンス』の「CORBA ブートストラップ処理のプログラミング リファレンス」を参照してください。

注意 : Oracle Tuxedo では、CORBA Interoperable Naming Service (INS) ブートストラップ処理メカニズムも使用できます。INS の詳細については、『Tuxedo CORBA プログラミング リファレンス』の「CORBA ブートストラップ処理のプログラミング リファレンス」を参照してください。

ビジネス トランザクションのサポート

OTS では、ビジネス トランザクションについて以下のサポートが提供されます。

分散トランザクションと 2 フェーズ コミット プロトコル

Oracle Tuxedo CORBA は、エンタープライズ アプリケーションに対して分散トランザクションと 2 フェーズ コミット プロトコルをサポートしています。分散トランザクションは、データベースなど複数のリソース マネージャを調整しながら更新するトランザクションです。2 フェーズ コミット (2PC) プロトコルは、1 つまたは複数のリソース マネージャにわたる単一のトランザクションを調節する方法です。トランザクションで実行した、関連するすべてのデータベースへの更新処理をコミットするか、または完全にロールバックしてトランザクション開始時の状態に戻すことにより、データの整合性を保証できます。

 


トランザクションの使用が必要な場合

トランザクションは、以下で述べる場合に適しています。以下はそれぞれ、Oracle Tuxedo CORBA でサポートされているトランザクション モデルです。

 


Oracle Tuxedo CORBA アプリケーションのトランザクションの使用方法

図 1-1 は、Oracle Tuxedo CORBA アプリケーションのトランザクションを示しています。

図 1-1 Oracle Tuxedo CORBA アプリケーションのトランザクション

Oracle Tuxedo CORBA アプリケーションのトランザクション

トランザクションの使用方法は、Oracle ブートストラップ処理メカニズムを使用するか、Interoperable Naming Service (INS) ブートストラップ処理メカニズムを使用するかによって異なります。

注意 : Oracle Tuxedo CORBA クライアント ソフトウェアを使用する場合は、Oracle ブートストラップ処理メカニズムを使用する必要があります。サード パーティのクライアントを使用する場合は、INS ブートストラップ処理メカニズムを使用する必要があります。

Oracle ブートストラップ処理メカニズムによるトランザクションの使用方法

Oracle 独自のブートストラップ処理メカニズムを使用する場合、以下の方法で基本的なトランザクションを使用します。

  1. クライアント アプリケーションが、Bootstrap オブジェクトを使用して Oracle Tuxedo ドメインの TransactionCurrent オブジェクトのオブジェクト参照を取得します。
  2. クライアント アプリケーションが、Tobj::TransactionCurrent::begin() オペレーションを使用してトランザクションを開始し、TP フレームワークを通じて CORBA インタフェースに要求を発行します。CORBA インタフェースのすべてのオペレーションは、トランザクションのスコープ内で実行されます。
    • それらのいずれかのオペレーションの呼び出しで (明示的にまたは通信障害の結果として) 例外が生成された場合は、その例外を捕捉できます。
    • 発生する必要があるすべての変更が正常に発生し、データベース (またはオブジェクト) の状態に一貫性がある場合、トランザクションはコミットされます。そうでない場合、トランザクションはロールバックされます。
    • クライアント アプリケーションでは Tobj::TransactionCurrent::commit() オペレーションを使用して現在のトランザクションをコミットします。このオペレーションは、トランザクションを終了して、オペレーションの処理を開始します。トランザクションは、トランザクションのすべての参加リソースがコミットに同意した場合にのみコミットされます。
  3. Tobj::TransactionCurrent::commit() オペレーションを実行すると、TP フレームワークはトランザクション マネージャを呼び出してトランザクションを完了します。
  4. トランザクション マネージャは、それぞれのリソース マネージャを調整してデータベースを更新する役割を果たします。

INS ブートストラップ処理メカニズムによるトランザクションの使用方法

CORBA サービスの Interoperable Naming Service (INS) のブートストラップ処理メカニズムを使用する場合、以下の方法で基本的なトランザクションを使用します。

  1. クライアント アプリケーションは、ORB::resolve_initial_references() オペレーションを使用して、Oracle Tuxedo ドメインの FactoryFinder オブジェクトを取得します。
  2. クライアント アプリケーションは、FactoryFinder を使用して TransactionFactory を取得します。
  3. 注意 : TransactionFactory は、Oracle の委譲型インタフェースではなく、標準の CORBA のトランザクション サービス インタフェースに準拠したオブジェクトを返します。これは、サード パーティのクライアントが、それぞれの ORB の resolve_initial_references() 関数を使用して Oracle Tuxedo CORBA サーバから TransactionFactory を取得し、標準 OMG IDL で生成されたスタブを使用して、返されたインスタンス上で機能できることを意味します。
  4. クライアント アプリケーションは、TransactionFactory の create() オペレーションを使用してトランザクションを開始し、TP フレームワークを介して CORBA インタフェースへの要求を発行します。
  5. create() オペレーションによって返された Control オブジェクトから、クライアント アプリケーションは、get_terminator() オペレーションを使用してトランザクションの Terminator インタフェースを取得します。
  6. 次に、クライアント アプリケーションは、Terminator インタフェースの commit() オペレーションまたは rollback() オペレーションを使用して、トランザクションを終了またはアボートします。commit() オペレーションを実行すると、TP フレームワークはトランザクション マネージャを呼び出してトランザクションを完了します。
  7. トランザクション マネージャは、それぞれのリソース マネージャを調整してデータベースを更新する役割を果たします。
注意 : CORBA インタフェースのすべてのオペレーションは、トランザクションのスコープ内で実行されます。
注意 : INS の詳細については、『Tuxedo CORBA プログラミング リファレンス』の「CORBA ブートストラップ処理のプログラミング リファレンス」を参照してください。

 


Transactions サンプル アプリケーションの記述

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

Transactions サンプル アプリケーションのワークフロー

Transactions サンプル CORBA アプリケーションでは、コースの登録のオペレーションがトランザクションのスコープ内で実行されます。Transactions サンプル アプリケーションで使用されるトランザクション モデルは、会話モデル、および単一のクライアントの呼び出しによってデータベース上で複数のオペレーションが実行されるモデルの組み合わせです。

Transactions サンプル アプリケーションは、以下のように機能します。

  1. 学生は登録するコースのリストを送信します。
  2. サーバ アプリケーションは、リスト内の各コースに対して以下をチェックします。
    • コースがデータベースにあるかどうか
    • 学生がコースに登録済みであるかどうか
    • 学生が履修できる単位の最大数を超えているかどうか
  3. 次のいずれかの処理が行われます。
    • コースがすべての基準を満たす場合は、サーバ アプリケーションによってそのコースに学生が登録されます。
    • コースがデータベースにない場合、またはそのコースに学生が既に登録されている場合は、サーバ アプリケーションによって、その学生が登録できないコースのリストに追加されます。すべての登録要求の処理が完了したら、サーバ アプリケーションは登録に失敗したコースのリストを返します。クライアント アプリケーションでは、トランザクションをコミットするか (登録要求が成功したコースで学生が登録される)、またはトランザクションをロールバックするか (どのコースにも学生は登録されない) を選択できます。
    • 学生が履修できる単位の最大数を超えている場合は、ユーザ例外 TooManyCredits がサーバ アプリケーションからクライアント アプリケーションに返されます。続いて、クライアント アプリケーションによって、要求が拒否されたという内容の簡単なメッセージが表示されます。その際、クライアント アプリケーションはトランザクションをロールバックします。

図 1-2 では、Transactions サンプル アプリケーションのしくみを示しています。

図 1-2 Transactions サンプル アプリケーション

Transactions サンプル アプリケーション

Transactions サンプル アプリケーションは、次の 2 とおりの方法でトランザクションをロールバックします。

注意 : Oracle Tuxedo CORBA アプリケーションにトランザクションが実装されるしくみについては、Oracle Tuxedo オンライン マニュアルの「Transactions サンプル アプリケーション」を参照してください。

開発手順

ここでは、トランザクション処理コードが含まれる Oracle Tuxedo アプリケーションの以下の開発手順を説明します。

この開発手順では、Transactions サンプル アプリケーションを例に挙げて説明します。Transactions サンプル アプリケーションのソース ファイルは、Oracle Tuxedo ソフトウェアの \samples\corba\university ディレクトリにあります。Transactions サンプル アプリケーションのビルドと実行の詳細については、Oracle Tuxedo オンライン マニュアルの「Transactions サンプル アプリケーション」を参照してください。

ステップ 1 : OMG IDL の記述

ほかの CORBA インタフェースの場合と同じように、トランザクションに関与するインタフェースを Object Management Group (OMG) インタフェース定義言語 (IDL) で指定する必要があります。また、そのインタフェースを使用して発生する可能性のあるすべてのユーザ例外を指定することも必要です。

Transactions サンプル アプリケーションでは、Registrar インタフェースと register_for_courses() オペレーションを OMG IDL で定義します。register_for_courses() オペレーションには、NotRegisteredList というパラメータがあります。このパラメータは、登録の失敗したコースのリストをクライアント アプリケーションに返します。NotRegisteredList の値が空の場合、クライアント アプリケーションはトランザクションをコミットします。また、TooManyCredits ユーザ例外も定義する必要があります。

コード リスト 1-1 は、Transactions サンプル アプリケーションの OMG IDL コードを示しています。

コード リスト 1-1 Transactions サンプル アプリケーションの OMG IDL
#pragma prefix "beasys.com"
module UniversityT
{
typedef unsigned long CourseNumber;
typedef sequence<CourseNumber> CourseNumberList;

struct CourseSynopsis
{
CourseNumber course_number;
string title;
};
typedef sequence<CourseSynopsis> CourseSynopsisList;

interface CourseSynopsisEnumerator
{
// エントリがない場合は長さ 0 のリストを返す
CourseSynopsisList get_next_n(
in unsigned long number_to_get, // 0 の場合はすべてが返される
out unsigned long number_remaining
);

void destroy();
};
typedef unsigned short Days;
const Days MONDAY = 1;
const Days TUESDAY = 2;
const Days WEDNESDAY = 4;
const Days THURSDAY = 8;
const Days FRIDAY = 16;
}
// スケジューリングされたすべての曜日の、正時に始まる
// 同じ時間帯に制限されたクラス
struct ClassSchedule
{
Days class_days; // 日のビットマスク
unsigned short start_hour; // 軍用時間による時間
unsigned short duration; // 分
};
struct CourseDetails
{
CourseNumber course_number;
double cost;
unsigned short number_of_credits;
ClassSchedule class_schedule;
unsigned short number_of_seats;
string title;
string professor;
string description;
};
typedef sequence<CourseDetails> CourseDetailsList;
typedef unsigned long StudentId;
struct StudentDetails
{
StudentId student_id;
string name;
CourseDetailsList registered_courses;
};
enum NotRegisteredReason
{
AlreadyRegistered,
NoSuchCourse
};
struct NotRegistered
{
CourseNumber course_number;
NotRegisteredReason not_registered_reason;
};
typedef sequence<NotRegistered> NotRegisteredList;
exception TooManyCredits
{
unsigned short maximum_credits;
};
// Registrar インタフェースは、学生がデータベース
// にアクセスするためのメインのインタフェース
interface Registrar
{
CourseSynopsisList
get_courses_synopsis(
in string search_criteria,
in unsigned long number_to_get,
out unsigned long number_remaining,
out CourseSynopsisEnumerator rest
);
   	CourseDetailsList get_courses_details(in CourseNumberList
courses);
StudentDetails get_student_details(in StudentId student);
NotRegisteredList register_for_courses(
in StudentId student,
in CourseNumberList courses
) raises (
TooManyCredits
);
};
// RegistrarFactory インタフェースが Registrar インタフェースを検索
interface RegistrarFactory
{
Registrar find_registrar(
);
};

ステップ 2 : インタフェースのトランザクション ポリシーの定義

トランザクション ポリシーは、インタフェースごとに使用されます。設計時に、Oracle Tuxedo CORBA アプリケーション内のどのインタフェースでトランザクションを処理するかを決定します。表 1-1 では、CORBA トランザクション ポリシーを説明します。

表 1-1 CORBA トランザクション ポリシー
トランザクション ポリシー
説明
always
インタフェースは常にトランザクションの一部である必要があります。インタフェースがトランザクションの一部ではない場合、トランザクションは TP フレームワークによって自動的に開始されます。
ignore
インタフェースはトランザクションに関与しません。ただし、トランザクションのスコープ内でこのインタフェースに要求を行うことはできます。このインタフェースの UBBCONFIG ファイルで指定される AUTOTRAN パラメータは無視されます。
never
インタフェースはトランザクションに関与しません。このインタフェース用に作成されるオブジェクトは、トランザクションに関与できません。Oracle Tuxedo システムは、このポリシーが設定されているインタフェースがトランザクションに関与した場合に例外 (INVALID_TRANSACTION) を生成します。
optional
インタフェースはトランザクションに関与できます。要求がトランザクションに関係する場合、オブジェクトはトランザクションに関与できます。このトランザクション ポリシーはデフォルトです。

開発段階では、トランザクション ポリシーを割り当てることで、どのインタフェースがトランザクションで実行されるのかを定義します。実装コンフィグレーション ファイル (ICF) で、トランザクション ポリシーを指定します。genicf コマンドを使用すると、テンプレートの ICF ファイルが作成されます。ICF の詳細については、『Tuxedo CORBA プログラミング リファレンス』の「実装コンフィグレーション ファイル (ICF)」を参照してください。

Transactions サンプル アプリケーションでは、Registrar インタフェースのトランザクション ポリシーが always に設定されます。

ステップ 3 : サーバ アプリケーションの記述

サーバ アプリケーションでトランザクションを使用する場合は、インタフェースのオペレーションを実装するメソッドを記述する必要があります。Transactions サンプル アプリケーションでは、register_for_courses() オペレーションのメソッド実装を記述します。

Oracle Tuxedo アプリケーションでデータベースを使用する場合は、XA リソース マネージャを開閉するコードが CORBA サーバ アプリケーションで必要となります。それらのオペレーションは、Server オブジェクトの Server::initialize() オペレーションと Server::release() オペレーションに含められます。コード リスト 1-2 は、XA リソース マネージャを開く、および閉じる Transactions サンプル アプリケーションの Server オブジェクトのコードの一部分です。

注意 : トランザクションを実装する CORBA サーバ アプリケーションの完全な例については、Oracle Tuxedo オンライン マニュアルの「Transactions サンプル アプリケーション」を参照してください。
コード リスト 1-2 Transactions サンプル アプリケーションの C++ Server オブジェクト
CORBA::Boolean Server::initialize(int argc, char* argv[])
{
TRACE_METHOD("Server::initialize");
try {
open_database();
begin_transactional();
register_fact();
return CORBA_TRUE;
}
catch (CORBA::Exception& e) {
LOG(“CORBA exception : “ <<e);
}
catch (SamplesDBException& e) {
LOG(“Can’t connect to database”);
}
catch (...) {
LOG(“Unexpected database error : “ <<e);
}
catch (...) {
LOG(“Unexpected exception”);
}
cleanup();
return CORBA_FALSE;
}

void Server::release()
{
TRACE_METHOD(“Server::release”);
cleanup();
}
static void cleanup()
{
unregister_factory();
end_transactional();
close_database();
}
// トランザクション リソース マネージャを管理するユーティリティ

CORBA::Boolean s_became_transactional = CORBA_FALSE;
static void begin_transactional()
{
TP::open_xa_rm();
s_became_transactional = CORBA_TRUE;
}
static void end_transactional()
{
if(!s_became_transactional){
return// クリーンアップは不要
}
try {
TP::close_xa_rm ();
}
catch (CORBA::Exception& e) {
LOG(“CORBA Exception : “ << e);
}
catch (...) {
LOG(“unexpected exception”);
}
	s_became_transactional = CORBA_FALSE;
}

ステップ 4 : クライアント アプリケーションの記述

クライアント アプリケーションでは、次のタスクを実行するコードが必要です。

  1. Bootstrap オブジェクトから TransactionCurrent オブジェクトのリファレンスを取得します。
  2. TransactionCurrent オブジェクトの Tobj::TransactionCurrent::begin() オペレーションを呼び出してトランザクションを開始します。
  3. オブジェクトのオペレーションを呼び出します。Transactions サンプル アプリケーションでは、クライアント アプリケーションが (コースのリストを渡して) Registrar オブジェクトの register_for_courses() オペレーションを呼び出します。

コード リスト 1-3 は、トランザクションの開発手順を説明する Transactions サンプル アプリケーションの CORBA C++ クライアント アプリケーションの一部分です。

注意 : コード リスト 1-3 で示されているサンプル コードは、Oracle ブートストラップ処理メカニズムの使用方法を示したものです。INS ブートストラップ処理メカニズムを使用方法については、『Tuxedo CORBA プログラミング リファレンス』の「CORBA ブートストラップ処理のプログラミング リファレンス」を参照してください。
コード リスト 1-3 CORBA C++ クライアント アプリケーションのトランザクション コード
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());
// トランザクションを開始
var_transaction_current_oref->begin();
try {
// トランザクション内でオペレーションを実行
pointer_Registar_ref->register_for_courses(student_id, course_number_list);
...
// オペレーションがエラーなしで実行された場合は、トランザクションをコミット
CORBA::Boolean report_heuristics = CORBA_TRUE;
var_transaction_current_ref->commit(report_heuristics);
}
catch (...) {
// オペレーションで実行エラーが発生した場合は、トランザクションを
// ロールバック。次に元の例外を再び送出する
// ロールバックが失敗した場合、例外を無視し、
// 元の例外を再び送出する
try {
var_transaction_current_ref->rollback();
}
catch (...) {
TP::userlog("rollback failed");
}
throw;
}

ステップ 5 : コンフィグレーション ファイルの作成

トランザクション対応 Oracle Tuxedo アプリケーションのコンフィグレーション ファイルには、次の情報を追加する必要があります。

コード リスト 1-4 は、Transactions サンプル アプリケーションのコンフィグレーション ファイルでこの情報が定義されている部分です。

コード リスト 1-4 Transactions サンプル アプリケーションのコンフィグレーション ファイル
*RESOURCES
IPCKEY 55432
DOMAINID university
MASTER SITE1
MODEL SHM
LDBAL N
SECURITY APP_PW
*MACHINES
BLOTTO
LMID = SITE1
APPDIR = C:\TRANSACTION_SAMPLE
TUXCONFIG=C:\TRANSACTION_SAMPLE\tuxconfig
TLOGDEVICE=C:\APP_DIR\TLOG
TLOGNAME=TLOG
TUXDIR="C:\tuxdir"
MAXWSCLIENTS=10
*GROUPS
SYS_GRP
LMID = SITE1
GRPNO = 1
ORA_GRP
LMID = SITE1
GRPNO = 2
	OPENINFO  = "ORACLE_XA:Oracle_XA+SqlNet=ORCL+Acc=P
/scott/tiger+SesTm=100+LogDir=.+MaxCur=5"
CLOSEINFO = ""
TMSNAME = "TMS_ORA"
TMSCOUNT = 2
*SERVERS
DEFAULT:
RESTART = Y
MAXGEN = 5

TMSYSEVT
SRVGRP = SYS_GRP
SRVID = 1
	TMFFNAME
SRVGRP = SYS_GRP
SRVID = 2
CLOPT = "-A -- -N -M"
	TMFFNAME
SRVGRP = SYS_GRP
SRVID = 3
CLOPT = "-A -- -N"
	TMFFNAME
SRVGRP = SYS_GRP
SRVID = 4
CLOPT = "-A -- -F"
	TMIFRSVR
SRVGRP = SYS_GRP
SRVID = 5

UNIVT_SERVER
SRVGRP = ORA_GRP
SRVID = 1
RESTART = N
   	ISL
SRVGRP = SYS_GRP
SRVID = 6
CLOPT = -A -- -n //MACHINENAME:2500
*SERVICES

トランザクション ログの詳細とコンフィグレーション ファイルのパラメータの定義については、「トランザクションの管理」を参照してください。


  ページの先頭       前  次