![]() |
![]() |
|
|
トランザクションについて
ここでは、次の内容について説明します。
BEA Tuxedo CORBA アプリケーションのトランザクションの概要
ここでは、次の内容について説明します。
トランザクションの ACID 特性
BEA Tuxedo システムの最も基本的な機能の 1 つが、トランザクション管理です。トランザクションは、データベース・トランザクションが誤りなく完了し、高性能トランザクションのすべての ACID 特性 (原子性、一貫性、独立性、および持続性) が確保されるようにする手段です。BEA Tuxedo は、完全なインフラストラクチャを提供することでトランザクションの整合性を保護し、さまざまなリソース・マネージャ (RM) にわたってデータベースが正しく更新されるようにします。いずれか 1 つのオペレーションが失敗した場合、一連のオペレーションがすべてロールバックされます。
リソース・マネージャ
リソース・マネージャ (RM) は、データベース管理システムや BEA Tuxedo システムの Application Queuing Manager のようなデータ・リポジトリであり、データにアクセスするためのツールを備えています。BEA Tuxedo システムは、1 つまたは複数の RM を使用してアプリケーションの状態を管理します。たとえば、銀行の預金残高のレコードは、RM に保存されています。預金引き出しサービスによってアプリケーションの状態が変わると、変更後の預金残高が、適切な RM に記録されます。
BEA Tuxedo システムは、XA インターフェイス対応の RM が関与するトランザクションを管理するのに役立ちます。BEA Tuxedo システムは、トランザクション・マネージャ (TM) として動作し、トランザクションに関連するすべての操作およびすべてのモジュールを調整します。
TM は、システム全体にわたるリソースが関与するグローバル・トランザクションを調整します。個々のリソースは、ローカルのリソース・マネージャ (RM) によって管理されます。トランザクション・マネージャ・サーバ (TMS) は、複数のリソースに関与するトランザクションの開始、コミット、およびアボートを行います。アプリケーション・コードは、RM に対して標準の埋め込み型 SQL インターフェイスを使用し、読み取りや更新を行います。TMS は、RM に対して XA インターフェイスを使用し、グローバル・トランザクション操作を実行します。
サポートされているプログラミング・モデル
BEA 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 モデル
BEA Tuxedo は、CORBA のオブジェクト・トランザクション・サービス (OTS) をサポートしています。BEA Tuxedo は、OTS に対する C++ インターフェイスを提供し、OTS に基づいています。OTS には、環境オブジェクト org.omg.CosTransactions.Current
を介してアクセスします。環境オブジェクト TransactionCurrent
を使用する際の詳細については、『BEA Tuxedo CORBA プログラミング・リファレンス』の「CORBA ブートストラップ処理のプログラミング・リファレンス」を参照してください。
注記 BEA Tuxedo では、CORBA インターオペラブル・ネーミング・サービス (INS) ブートストラップ処理メカニズムも使用できます。INS の詳細については、『BEA Tuxedo CORBA プログラミング・リファレンス』の「CORBA ブートストラップ処理のプログラミング・リファレンス」を参照してください。
ビジネス・トランザクションのサポート
OTS では、ビジネス・トランザクションについて以下のサポートが提供されます。
分散トランザクションと 2 フェーズ・コミット・プロトコル
BEA Tuxedo CORBA は、エンタープライズ・アプリケーションに対して分散トランザクションと 2 フェーズ・コミット・プロトコルをサポートしています。分散トランザクションは、データベースなど複数のリソース・マネージャを調整しながら更新するトランザクションです。2 フェーズ・コミット (2PC) プロトコル は、1 つまたは複数のリソース・マネージャにわたる単一のトランザクションを調節する方法です。トランザクションで実行した、関連するすべてのデータベースへの更新処理をコミットするか、または完全にロールバックしてトランザクション開始時の状態に戻すことにより、データの整合性を保証できます。
トランザクションの使用が必要な場合
トランザクションは、以下で述べる場合に適しています。以下はそれぞれ、BEA Tuxedo CORBA でサポートされているトランザクション・モデルです。
たとえば、旅行代理店アプリケーションがあるとします。クライアント・アプリケーションは、たとえばフランスのストラスブールからオーストラリアのアリス・スプリングスまでなど、遠隔地への旅行を手配する必要があります。このような旅行では、複数の予約が必要になります。クライアント アプリケーションでは、旅程の各区分の予約が順番に行われます。たとえば、ストラスブールからパリ、パリからニューヨーク、ニューヨークからロサンゼルスの予約が順番に行われます。ただし、いずれかのフライトの予約ができない場合、クライアント アプリケーションではそれまでに行ったフライトの予約をすべてキャンセルする必要があります。
たとえば、インターネット・ベースのオンライン・ショッピング・カート・アプリケーションがあるとします。クライアント・アプリケーションのユーザは、オンライン・カタログをブラウズして、複数の購入を選択します。ユーザはすべての品目を選択して購入を指定すると、チェック・アウトに進み、クレジット・カード情報を入力して購入を確定します。クレジット・カードのチェックに失敗した場合、ショッピング・アプリケーションでは、ショッピング・カートで保留中のすべての購入選択をキャンセルするか、会話の最中に発生した購入トランザクションをロールバックする必要があります。
たとえば、銀行取引アプリケーションがあるとします。クライアントは、窓口オブジェクトに対して振替オペレーションを呼び出します。振替オペレーションは、銀行データベースに対して以下の呼び出しを実行するために窓口オブジェクトを必要とします。
銀行データベースの振替先呼び出しに失敗した場合、銀行取引アプリケーションではそれまでの振替元呼び出しをロールバックする機能が必要です。
BEA Tuxedo CORBA アプリケーションのトランザクションの使用方法
図 1-1 では、BEA Tuxedo CORBA アプリケーションのトランザクションを示しています。
図1-1 BEA Tuxedo CORBA アプリケーションのトランザクション
トランザクションの使用方法は、BEA ブートストラップ処理メカニズムを使用するか、インターオペラブル・ネーミング・サービス (INS) ブートストラップ処理メカニズムを使用するかによって異なります。
注記 BEA Tuxedo CORBA クライアント・ソフトウェアを使用する場合は、BEA ブートストラップ処理メカニズムを使用する必要があります。サード・パーティのクライアントを使用する場合は、INS ブートストラップ処理メカニズムを使用する必要があります。
BEA ブートストラップ処理メカニズムによるトランザクションの使用方法
BEA 独自のブートストラップ処理メカニズムを使用する場合、以下の方法で基本的なトランザクションを使用します。
Tobj::TransactionCurrent::begin()
オペレーションを使用してトランザ
クションを開始し、TP フレームワークを通じて CORBA インターフェイス
に要求を発行します。CORBA インターフェイスのすべてのオペレーション
は、トランザクションのスコープ内で実行されます。
Tobj::TransactionCurrent::commit()
オペレーションを使用して現在のトランザクションをコミットします。このオペレーションは、トランザクションを終了して、オペレーションの処理を開始します。 トランザクションは、トランザクションのすべてのパーティシパントがコミットに同意した場合にのみコミットされます。 Tobj::TransactionCurrent::commit()
オペレーションを実行すると、TP
フレームワークはトランザクション・マネージャを呼び出してトランザク
ションを完了します。
INS ブートストラップ処理メカニズムによるトランザクションの使用方法
CORBA サービス・インターオペラブル・ネーミング・サービス (INS) のブートストラップ処理メカニズムを使用する場合、以下の方法で基本的なトランザクションを使用します。
ORB::resolve_initial_references()
オペレーションを使用して、BEA
Tuxedo ドメインの FactoryFinder オブジェクトを取得します。
注記 TransactionFactory は、BEA の委譲型インターフェイスではなく、標準の CORBA のトランザクション・サービス・インターフェイスに準拠したオブジェクトを返します。これは、サード・パーティのクライアントが、それぞれの ORB の resolve_initial_references()
関数を使用して BEA Tuxedo CORBA サーバから TransactionFactory を取得し、標準 OMG IDL で生成されたスタブを使用して、返されたインスタンス上で機能できることを意味します。
create()
オペ
レーションを使用してトランザクションを開始し、TP フレームワークを介
して CORBA インターフェイスへの要求を発行します。
create()
オペレーションによって返された Contorol オブジェクトから、ク
ライアント・アプリケーションは、get_terminator()
オペレーションを使
用してトランザクションの Terminator インターフェイスを取得します。
commit()
オペレーションまたは rollback()
オペレーションを使用して、
トランザクションを終了またはアボートします。commit()
オペレーション
を実行すると、TP フレームワークはトランザクション・マネージャを呼び
出してトランザクションを完了します。
注記 CORBA インターフェイスのすべてのオペレーションは、トランザクションのスコープ内で実行されます。
Terminator::commit()
オペレーションを使用して現在のトランザクションをコミットします。このオペレーションは、トランザクションを終了して、オペレーションの処理を開始します。 トランザクションは、トランザクションのすべてのパーティシパントがコミットに同意した場合にのみコミットされます。 注記 INS の詳細については、『BEA Tuxedo CORBA プログラミング・リファレンス
』の「CORBA ブートストラップ処理のプログラミング・リファレンス」を参照してください。
Transactions サンプル・アプリケーションの記述
ここでは、次の内容について説明します。
Transactions サンプル・アプリケーションのワークフロー
Transactions サンプル CORBA アプリケーションでは、コースの登録のオペレーションがトランザクションのスコープ内で実行されます。Transactions サンプル・アプリケーションで使用されるトランザクション・モデルは、会話モデル、および単一のクライアントの呼び出しによってデータベース上で複数のオペレーションが実行されるモデルの組み合わせです。
Transactions サンプル・アプリケーションは以下のように機能します。
TooManyCredits
がサーバ・アプリケーションからクライアント・アプリケーションに返されます。クライアント・アプリケーションでは、要求が拒否されたことを説明する短いメッセージが表示されます。その後、クライアント・アプリケーションによってトランザクションがロールバックされます。 図 1-2 に、Transactions サンプル・アプリケーションのしくみを示します。
図1-2 Transactions サンプル・アプリケーション
Transactions サンプル・アプリケーションは、次の 2 とおりの方法でトランザクションをロールバックします。
したがって、Transactions サンプル・アプリケーションでも、ユーザ定義の CORBA 例外をインプリメントする方法が示されています。たとえば、学生が登録可能なコースの最大数を超えているコースに登録しようとすると、サーバ・アプリケーションは、TooManyCredits
例外を返します。クライアント・アプリケーションは、この例外を受け取ると、自動的にトランザクションをロールバックします。
注記 BEA Tuxedo CORBA アプリケーションにトランザクションがインプリメントされるしくみについては、BEA Tuxedo オンライン・マニュアルの Transactions サンプルを参照してください。
開発手順
ここでは、トランザクション処理コードが含まれる BEA Tuxedo アプリケーションの以下の開発手順をを説明します。
この開発手順では、Transactions サンプル・アプリケーションを例に挙げて説明します。Transactions サンプル・アプリケーションのソース・ファイルは、BEA Tuxedo ソフトウェアの \samples
\corba
\university
ディレクトリにあります。Transactions サンプル・アプリケーションのビルドと実行の詳細については、BEA 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: インターフェイスのトランザクション方針の定義
トランザクション方針は、インターフェイスごとに使用されます。設計時に、BEA Tuxedo アプリケーション内のどのインターフェイスでトランザクションを処理するかが指定されます。表 1-1 では、CORBA トランザクション方針を説明します。
開発段階では、トランザクション方針を割り当てることで、どのインターフェイスがトランザクションで実行されるのかを定義します。インプリメンテーション・コンフィギュレーションファイル (ICF) で、トランザクション方針を指定します。genicf
コマンドを使用すると、テンプレートの ICF ファイルが作成されます。ICF の詳細については、『BEA Tuxedo CORBA プログラミング・リファレンス』の「インプリメンテーション・コンフィギュレーション・ファイル (ICF)」を参照してください。
Transactions サンプル・アプリケーションでは、Registrar
インターフェイスのトランザクション方針が always
に設定されます。
ステップ 3: サーバ・アプリケーションの記述
サーバ・アプリケーションでトランザクションを使用する場合は、インターフェイスのオペレーションをインプリメントするメソッドを記述する必要があります。Transactions サンプル・アプリケーションでは、register_for_courses()
オペレーションのメソッド・インプリメンテーションを記述します。
BEA Tuxedo アプリケーションでデータベースを使用する場合は、XA リソース・マネージャを開閉するコードが CORBA サーバ・アプリケーションで必要となります。それらのオペレーションは、Server オブジェクトの Server::initialize()
オペレーションと Server::release()
オペレーションに含められます。リスト 1-2 は、XA リソース・マネージャをオープンおよびクローズするTransactions サンプル・アプリケーションの Server オブジェクトのコードの一部分です。
注記 トランザクションをインプリメントする CORBA アプリケーションの完全な例については、BEA 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: クライアント・アプリケーションの記述
クライアント・アプリケーションでは、次のタスクを実行するコードが必要です。
Tobj::TransactionCurrent::begin()
オペレーションを呼び出してトランザクションを開始します。
register_for_courses()
オペレー
ションを呼び出します。
リスト 1-3 は、トランザクションの開発手順を説明する Transactions サンプル・アプリケーションの CORBA C++ クライアント・アプリケーションの一部分です。
注記 リスト 1-3 で示されているサンプル・コードは、BEA ブートストラップ処理メカニズムの使用方法を示したものです。INS ブートストラップ処理メカニズムを使用する際の詳細については、『BEA Tuxedo CORBA プログラミング・リファレンス』の「CORBA ブートストラップ処理のプログラミング・リファレンス」を参照してください。
ActiveX クライアント・アプリケーションでのトランザクションの使用例については、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: コンフィギュレーション・ファイルの作成
トランザクション対応 BEA Tuxedo アプリケーションのコンフィギュレーション・ファイルには、次の情報を追加する必要があります。
GROUPS
セクションOPENINFO
パラメータで、データベースのリソース・マネージャをオープンするのに必要な情報を指定します。この情報は、データベースの製品マニュアルから取得します。デフォルト・バージョンの com.beasys.Tobj.Server.initialize
メソッドは、自動的にリソース・マネージャをオープンします。CLOSEINFO
パラメータで、データベースのリソース・マネージャをクローズするのに必要な情報を指定します。デフォルトでは、CLOSEINFO
パラメータは空です。TMSNAME
パラメータと TMSCOUNT
パラメータを指定して、XA リソース・マネージャを、指定したサーバ・グループに関連付けます。SERVERS
セクションで、インターフェイスがあるサーバ・アプリケーションと、データベースを管理するサーバ・アプリケーションの両方を含むサーバ・グループを定義します。このサーバ・グループは、トランザクションに関与するように指定する必要があります。TLOGDEVICE
パラメータで、トランザクション・ログ (TLOG
) にパス名を指定します。トランザクション・ログの詳細については、トランザクションの管理を参照してください。リスト 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
トランザクション・ログの詳細とコンフィギュレーション・ファイルのパラメータの定義については、トランザクションの管理を参照してください。
![]() |
![]() |
|
Copyright © 2001, BEA Systems, Inc. All rights reserved.
|