bea ホーム | 製品 | dev2dev | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > Tuxedo > Tuxedo CORBA アプリケーション入門 > トランザクションの使い方 |
Tuxedo CORBA アプリケーション入門
|
トランザクションの使い方
ここでは、以下の内容について説明します。
注記 ここでは、CORBA サービスのオブジェクト・トランザクション・サービスに対する C++ インターフェイスの使い方について説明します。BEA Tuxedo 製品の CORBA 環境で利用可能なトランザクション機能の説明、およびそれらのトランザクション機能をインプリメントする手順については、BEA Tuxedo オンライン・マニュアルの『BEA Tuxedo CORBA トランザクション』 を参照してください。
セキュリティ・サービスの概要
BEA Tuxedo 製品の最も基本的な機能の 1 つにトランザクション管理があります。トランザクションは、データベース・トランザクションが誤りなく完了し、高性能トランザクションのすべての ACID 特性 (原子性、一貫性、独立性、および持続性) が確保されるようにする手段です。BEA Tuxedo システムでは、データベースの更新が (さまざまなリソース・マネージャにまたがる場合でも) 誤りなく実行されるようにする完全なインフラストラクチャによってトランザクションの整合性が保護されます。
BEA Tuxedo システムでは、次の機能が利用されます。
BEA Tuxedo 製品の CORBA 環境では、オブジェクト・トランザクション・サービスに対する C++ インターフェイスが提供されます。OTS には、TransactionCurrent 環境オブジェクトを通じてアクセスします。TransactionCurrent 環境オブジェクトの使い方については、BEA Tuxedo オンライン・マニュアルの『BEA Tuxedo CORBA クライアント・アプリケーションの開発方法』を参照してください。
OTS では、ビジネス・トランザクションについて以下のサポートが提供されます。
トランザクションのしくみ
図5-1 は、BEA Tuxedo CORBA アプリケーションでトランザクションがどのように機能するのかを示しています。
図 5-1 BEA Tuxedo CORBA アプリケーションでのトランザクションのしくみ
注記 BEA Tuxedo CORBA では、CORBA インターオペラブル・ネーミング・サービス (INS) を利用してもセキュリティ・サービスの初期オブジェクト・リファレンスを取得できます。INS ブートストラップ処理メカニズムについては、『BEA Tuxedo CORBA プログラミング・リファレンス』を参照してください。
Transactions サンプル・アプリケーション
Transactions サンプル・アプリケーションでは、コースの登録のオペレーションがトランザクションのスコープ内で実行されます。Transactions サンプル・アプリケーションで使用されるトランザクション・モデルは、会話型モデルと、単一クライアントの呼び出しでデータベースの複数の個別オペレーションが呼び出されるモデルを組み合わせたものです。
Transactions サンプル・アプリケーションは、以下のように機能します。
図5-2 では、Transactions サンプル・アプリケーションのしくみを示しています。
図 5-2 Transactions サンプル・アプリケーション
Transactions サンプル・アプリケーションは、次の 2 とおりの方法でトランザクションをロールバックします。
開発手順
ここでは、トランザクションが含まれる BEA Tuxedo CORBA アプリケーションの開発手順を説明します。表 5-1 は、開発手順を示しています。
表 5-1 トランザクションの含まれる BEA Tuxedo CORBA アプリケーションの開発手順
この開発手順では、Transactions サンプル・アプリケーションを例に挙げて説明します。Transactions サンプル・アプリケーションのソース・ファイルは、BEA Tuxedo ソフトウェアの ¥samples¥corba¥university ディレクトリにあります。Transactions サンプル・アプリケーションのビルドと実行については、BEA Tuxedo オンライン・マニュアルの『BEA Tuxedo CORBA University サンプル・アプリケーション』を参照してください。
ステップ 1: OMG IDL コードの記述
ほかの CORBA インターフェイスの場合と同じように、トランザクションに関与するインターフェイスを Object Management Group (OMG) インターフェイス定義言語 (IDL) で指定する必要があります。また、そのインターフェイスを使用して発生する可能性のあるすべてのユーザ例外を指定することも必要です。
Transactions サンプル・アプリケーションでは、Registrar インターフェイスと register_for_courses() オペレーションを OMG IDL で定義します。register_for_courses() オペレーションには、NotRegisteredList というパラメータがあります。このパラメータは、登録の失敗したコースのリストを CORBA クライアント・アプリケーションに返します。NotRegisteredList の値が空の場合、CORBA クライアント・アプリケーションはトランザクションをコミットします。また、TooManyCredits ユーザ例外も定義する必要があります。
リスト5-1 は、Transactions サンプル・アプリケーションの OMG IDL コードを示しています。
コード リスト 5-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 CORBA アプリケーション内のどのインターフェイスでトランザクションを処理するかを決定します。次の表は、トランザクション方針のリストです。
開発段階では、トランザクション方針を割り当てることで、どのインターフェイスがトランザクションで実行されるのかを定義します。 CORBA サーバ・アプリケーションでは、インプリメンテーション・コンフィギュレーション・ファイル (ICF) でトランザクション方針を指定します。genicf コマンドを実行すると、テンプレートの ICF ファイルが作成されます。 Transactions サンプル・アプリケーションでは、Registrar インターフェイスのトランザクション方針が always に設定されます。 ステップ 3: CORBA クライアント・アプリケーションの記述 CORBA クライアント・アプリケーションでは、次のタスクを実行するコードが必要です。
リスト5-2 は、トランザクションの開発手順を説明する Transactions サンプル・アプリケーションの CORBA C++ クライアント・アプリケーションの一部分です。
コード リスト 5-2 CORBA C++ クライアント・アプリケーションのトランザクション・コード
CORBA::Object_var var_transaction_current_oref =
Bootstrap.resolve_initial_references("TransactionCurrent");
CosTransactions::Current_var var_transaction_current_ref=
CosTransactions::Current::_narrow(var_transaction_current_oref.in());
//トランザクションを開始
var_transaction_current_ref->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;
}
ステップ 4: CORBA サーバ・アプリケーションの記述
CORBA サーバ・アプリケーションでトランザクションを使用する場合は、インターフェイスのオペレーションをインプリメントするメソッドを記述する必要があります。Transactions サンプル・アプリケーションでは、register_for_courses() オペレーションのメソッド・インプリメンテーションを記述します。
BEA Tuxedo CORBA アプリケーションでデータベースを使用する場合は、XA リソース・マネージャを開閉するコードが CORBA サーバ・アプリケーションで必要となります。それらのオペレーションは、Server オブジェクトの Server::initialize()オペレーションと Server::release() オペレーションに含められます。
リスト5-3 は、XA リソース・マネージャをオープンおよびクローズする Transactions サンプル・アプリケーションの Server オブジェクトのコードの一部分です。
注記 トランザクションをインプリメントする C++ サーバ・アプリケーションの完全な例については、BEA Tuxedo オンライン・マニュアルの『BEA Tuxedo CORBA トランザクション』の Transactions サンプル・アプリケーションを参照してください。
コード リスト 5-3 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 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;
}
ステップ 5: コンフィギュレーション・ファイルの作成
トランザクション対応 BEA Tuxedo CORBA アプリケーションのコンフィギュレーション・ファイルには、次の情報を追加する必要があります。
リスト5-4 は、Transactions サンプル・アプリケーションのコンフィギュレーション・ファイルでこの情報が定義されている部分です。
コード リスト 5-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"
OPENINFO = "ORACLE_XA:Oracle_XA+Acc=P/scott/tiger
+SesTm=100+LogDir=.+MaxCur=5"
CLOSEINFO = ""
TMSNAME = "TMS_ORA"
*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
トランザクション・ログ、およびコンフィギュレーション・ファイルのパラメータの定義については、BEA Tuxedo オンライン・マニュアルの『BEA Tuxedo アプリケーションの設定』を参照してください。
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |