目次 前 次 PDF


トランザクションの紹介

トランザクションの紹介
このトピックには次の項が含まれます:
注意:
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製品では、データベースの更新が(様々なリソース・マネージャにまたがる場合でも)誤りなく実行されるようにする完全なインフラストラクチャによってトランザクションの整合性が保護されます。操作が1つでも失敗すると、操作全体がロールバックされます。
リソース・マネージャ
リソース・マネージャ(RM)は、データベース管理システムやOracle TuxedoシステムのApplication Queuing Managerのようなデータ・リポジトリであり、データにアクセスするためのツールを備えています。Oracle Tuxedoシステムは、1つ以上のRMを使用してアプリケーションの状態を管理します。たとえば、銀行の預金残高のレコードは、RMに保存されています。預金引出しサービスによってアプリケーションの状態が変わると、変更後の預金残高が適切なRMに記録されます。
Oracle Tuxedoシステムは、XAインタフェース対応のリソース・マネージャが関与するトランザクションを管理するのに役立ちます。Oracle Tuxedoシステムは、トランザクション・マネージャ(TM: Transaction Manager)として動作し、トランザクションに関連するすべての操作およびすべてのモジュールを調整します。
TMは、システム全体に渡るリソースが関与するグローバル・トランザクションを調整します。個々のリソースは、ローカルのリソース・マネージャ(RM)によって管理されます。トランザクション・マネージャ・サーバー(TMS: Transaction Manager Server)は、複数のリソースに関与するトランザクションの開始、コミット、および停止を行います。アプリケーション・コードは、RMに対して標準の埋込み型SQLインタフェースを使用し、読取りや更新を行います。TMSは、RMに対してXAインタフェースを使用し、グローバル・トランザクション操作を実行します。
サポートされているプログラミング・モデル
Oracle Tuxedoは、C++でObject Management GroupのCommon Object Request Broker (CORBA)をサポートしており、「The Common Object Request Broker: Architecture and Specification, Revision 2.4.2」(2001年1月)に準拠しています。
サポートされているAPIモデル
Oracle Tuxedoでは、CORBAサービスのObject Transaction Service (OTS)をサポートしています。Oracle TuxedoにはOTSへのC++インタフェースが用意されており、OTSに基づいています。OTSには、org.omg.CosTransactions.Current環境オブジェクトを使用してアクセスします。TransactionCurrent環境オブジェクトの使用方法の詳細は、『CORBAプログラミング・リファレンス』のCORBAブートストラップ処理のプログラミング・リファレンスに関する項を参照してください。
注意:
Oracle Tuxedoでは、CORBA Interoperable Naming Service (INS)ブートストラップ処理メカニズムの使用もサポートされています。INSの詳細は、『CORBAプログラミング・リファレンス』のCORBAブートストラップ処理のプログラミング・リファレンスに関する参照してください。
ビジネス・トランザクションのサポート
OTSでは、ビジネス・トランザクションについて次のサポートが提供されます。
クライアント・アプリケーションによってトランザクションが開始されたときにグローバル・トランザクション識別子が作成されます。
トランザクションに関わっており、したがってトランザクションのコミット段階で調整しなければならないオブジェクトを追跡するためにOracle Tuxedoインフラストラクチャが連係して機能します。
トランザクションでアクセスされるときに、リソース・マネージャ(たいていはデータベース)が通知を受けます。通知を受けたリソース・マネージャは、トランザクションが終了するまでアクセス対象のレコードをロックします。
トランザクションが完了したときに2フェーズ・コミットが調整され、トランザクションのすべての参加リソースで更新が同時にコミットされます。The Open GroupのXAプロトコルを使用して、更新されるすべてのデータベースでコミットがコーディネートされます。この規格は、ほぼすべてのリレーショナル・データベースでサポートされています。
トランザクションを停止する必要があるときにロールバック処理が実行されます。
障害が起きたときにリカバリ処理が実行されます。クラッシュの時点でアクティブだったトランザクションが確認され、そのトランザクションをロールバックするのかコミットするのかが判断されます。
分散トランザクションと2フェーズ・コミット・プロトコル
Oracle Tuxedo CORBAでは、エンタープライズ・アプリケーションの分散トランザクションと2フェーズ・コミット・プロトコルがサポートされます。分散トランザクションとは、複数のリソース・マネージャ(データベースなど)が調和的に更新されるトランザクションのことです。2フェーズ・コミット・プロトコル(2PC)は、複数のリソース・マネージャにまたがって1つのトランザクションを調整する手段です。これにより、トランザクションによる更新を関連するデータベースのすべてでコミットするか、すべてのデータベースから完全にロールバックし、トランザクション開始前の状態に戻すことで、データの整合性が保証されます。
トランザクションの使用が必要な場合
トランザクションは次のリストで説明される状況に適しています。それぞれの状況は、Oracle Tuxedo CORBAでサポートされているトランザクション・モデルを説明しています。
クライアント・アプリケーションは複数のオブジェクトへの呼出しを行う必要があり、このために複数のデータベースへの書込み操作が関係します。呼出しのいずれかが失敗した場合は、(メモリー、またはより一般的にはデータベースに)書き込まれた状態をロールバックする必要があります。
たとえば、旅行代理店アプリケーションがあるとします。クライアント・アプリケーションは、たとえばフランスのストラスブールからオーストラリアのアリス・スプリングスまでなど、遠隔地への旅行を手配する必要があります。このような旅行では、複数の予約が必要になります。クライアント・アプリケーションでは、旅程の各区分の予約が順番に行われます。たとえば、ストラスブールからパリ、パリからニューヨーク、ニューヨークからロサンゼルスの予約が順番に行われます。しかし、いずれかのフライトが予約できないとき、クライアント・アプリケーションにはその時点で予約済の他のフライトをすべてキャンセルする方法が必要です。
クライアント・アプリケーションで、サーバー・アプリケーションで管理されるオブジェクトとの対話を必要とし、特定のオブジェクト・インスタンスに対する複数の呼出しを行う必要があります。その対話には、次のような特徴の1つまたは複数が備わっています。
データは、連続する各呼出しの間または後でメモリーにキャッシュされるか、データベースに書き込まれます。
データは、対話の終わりにデータベースに書き込まれます。
クライアント・アプリケーションでは、各呼出し間のインメモリー・コンテキストを保持するオブジェクトが必要となります。つまり、連続する各呼出しでは、対話の全体を通してメモリーに保持されているデータが使用されます。
対話の最後に、クライアント・アプリケーションでは対話の途中または最後に行われたデータベースへの書込み処理をすべて取り消す機能が必要となります。
たとえば、インターネット・ベースのオンラインのショッピング・カート・アプリケーションについて考えてみます。クライアント・アプリケーションのユーザーがオンライン・カタログを一覧して、購入する物を複数選択します。ユーザーは、購入したい商品をすべて選択したら、支払に進み、クレジット・カード情報を入力して購入します。クレジット・カードの確認が失敗した場合、ショッピング・アプリケーションでは、ショッピング・カート内の未決済の購入商品をすべて取り消すか、やり取りの際に行われたすべての購入トランザクションをロールバックできる必要があります。
オブジェクトに対する単一のクライアント呼出しのスコープ内で、オブジェクトは、データベース内のデータに対する複数の編集を実行します。編集のいずれかが失敗した場合、オブジェクトにはすべての編集をロールバックするメカニズムが必要です。(この状況では、個々のデータベース編集は必ずしもCORBA呼出しでなくてもかまいません。)
たとえば、銀行のアプリケーションを考えてください。クライアントでは、出納オブジェクトに対して送金処理を呼び出します。送金処理においては、出納オブジェクトは銀行のデータベースで次の呼出しを行わなければなりません。
1つの口座で送金メソッドを呼び出します。
別の口座で入金メソッドを呼び出します。
データベースで入金が失敗した場合、アプリケーションでは直前の送金をロールバックすることが必要となります。
Oracle Tuxedo CORBAアプリケーションのトランザクションの使用方法
図1-1に、Oracle CORBAアプリケーションのトランザクションを示します。
図1-1 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ブートストラップ処理メカニズムによるトランザクションの使用方法
Interoperable Naming Service (INS)ブートストラップ処理メカニズムが使用されているCORBAサービスを使用する場合は、次の方法で基本的なトランザクションを使用します。
1.
クライアント・アプリケーションは、ORB::resolve_initial_references()操作を使用して、Oracle TuxedoドメインのFactoryFinderオブジェクトを取得します。
2.
クライアント・アプリケーションは、FactoryFinderを使用してTransactionFactoryを取得します。
注意:
TransactionFactoryは、Oracleの委任型インタフェースではなく、標準のCORBAサービスのトランザクション・サービス・インタフェースに準拠したオブジェクトを返します。これは、サード・パーティ・クライアントが、それぞれのORBのresolve_initial_references()関数を使用してOracle Tuxedo CORBAサーバーからTransactionFactoryを取得し、標準OMG IDLで生成されたスタブを使用して、返されたインスタンス上で機能できることを意味します。
3.
クライアント・アプリケーションが、TransactionFactory上でcreate()操作を使用してトランザクションを開始し、TPフレームワークを通じてCORBAインタフェースにリクエストを発行します。
4.
クライアント・アプリケーションは、create()操作で返されるControlオブジェクトから、get_terminator()操作を使用してトランザクションのTerminatorインタフェースを取得します。
5.
クライアント・アプリケーションは、Terminatorインタフェースでcommit()rollback()操作を使用してトランザクションを終了または中断します。commit()操作により、TPフレームワークがトランザクション・マネージャを呼び出してトランザクションを終了します。
6.
トランザクション・マネージャの役割は、リソース・マネージャと協力してデータベースを更新することです。
注意:
CORBAインタフェースのすべての操作は、トランザクションのスコープ内で実行されます。
それらのいずれかの操作の呼出しで(明示的にまたは通信障害の結果として)例外が生成された場合は、その例外が捕捉されます。
必要のある変更がすべて正常に行われ、データベース(またはオブジェクト)の状態に一貫性がある場合は、トランザクションがコミットされます。それ以外の場合、トランザクションはロールバックされます。
クライアント・アプリケーションではTerminator::commit()操作を使用して現在のトランザクションをコミットします。この操作は、トランザクションを終了して操作の処理を開始します。トランザクションは、トランザクションのすべての参加リソースがコミットに同意した場合にのみコミットされます。
注意:
INSの詳細は、『CORBAプログラミング・リファレンス』のCORBAブートストラップ処理のプログラミング・リファレンスに関する項を参照してください。
Transactionsサンプル・アプリケーションの記述
このトピックには次の項が含まれます:
Transactionsサンプル・アプリケーションのワークフロー
TransactionsサンプルCORBAアプリケーションでは、コースの登録のオペレーションがトランザクションのスコープ内で実行されます。Transactionsサンプル・アプリケーションで使用されるトランザクション・モデルは、会話型モデルと、単一クライアントの呼出しでデータベースの複数の個別オペレーションが呼び出されるモデルを組み合せたものです。
Transactionsサンプル・アプリケーションは、次のように機能します。
1.
学生は登録するコースのリストを送信します。
2.
リスト内のコースごとに、サーバー・アプリケーションは次の点をチェックします。
コースがデータベースにあるかどうか
学生がコースに登録済であるかどうか
学生が履修できる単位の最大数を超えているかどうか
3.
次のいずれかの処理が行われます。
すべての基準をコースが満たしている場合、サーバー・アプリケーションはコースに学生を登録します。
コースがデータベースにない場合、またはそのコースで学生がすでに登録されている場合は、サーバー・アプリケーションによって、学生を登録できないコースのリストにそのコースが追加されます。すべての登録リクエストが処理された後、サーバー・アプリケーションは登録に失敗したコースのリストを返します。クライアント・アプリケーションでは、トランザクションをコミットするか(登録リクエストが成功したコースで学生が登録される)、またはトランザクションをロールバックするか(どのコースにも学生は登録されない)を選択できます。
学生が履修できる単位の最大数を超えている場合は、TooManyCreditsユーザー例外がサーバー・アプリケーションからクライアント・アプリケーションに返されます。続いて、クライアント・アプリケーションによって、リクエストが拒否されたという内容の簡単なメッセージが表示されます。その際、クライアント・アプリケーションはトランザクションをロールバックします。
図1-2では、Transactionsサンプル・アプリケーションのしくみを示しています。
図1-2 Transactionsサンプル・アプリケーション
Transactionsサンプル・アプリケーションは、次の2通りの方法でトランザクションをロールバックします。
致命的ではない場合。コースがデータベースに存在しないか、学生がすでに登録されているためにコースの登録が失敗する場合は、それらのコースの数がサーバー・アプリケーションからクライアント・アプリケーションに返されます。トランザクションをロールバックするかどうかは、クライアント・アプリケーションのユーザーに任せられます(Transactionクライアント・アプリケーション・コードでは、自動的にトランザクションをロールバックします)。
致命的な場合。登録できる単位の最大数を超えているためにコースの登録が失敗する場合は、サーバー・アプリケーションによってCORBA例外が生成され、その例外がクライアントに返されます。この場合も、トランザクションをロールバックするかどうかは、クライアント・アプリケーションに依存します。
したがって、Transactionsサンプル・アプリケーションでも、ユーザー定義のCORBA例外を実装する方法が示されています。たとえば、学生が登録可能なコースの最大数を超えているコースに登録を試行すると、サーバー・アプリケーションは、TooManyCredits例外を返します。クライアント・アプリケーションは、この例外を受け取ると、自動的にトランザクションをロールバックします。
注意:
Oracle Tuxedo CORBAアプリケーションにトランザクションを実装する方法の詳細は、Oracle Tuxedoオンライン・ドキュメントのトランザクションのサンプルに関する項を参照してください。
開発手順
このトピックでは、トランザクション処理コードを含むOracle Tuxedoアプリケーションを記述するための次の開発手順を説明します。
この開発手順では、Transactionsサンプル・アプリケーションを例にあげて説明します。Transactionsサンプル・アプリケーションのソース・ファイルは、Oracle Tuxedoソフトウェアの\samples\corba\university ディレクトリにあります。Transactionsサンプル・アプリケーションのビルドと実行の詳細は、Oracle Tuxedoオンライン・ドキュメントのトランザクションのサンプルに関する参照してください。
ステップ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
       {
       //Returns a list of length 0 if there are no more entries
       CourseSynopsisList get_next_n(
              in unsigned long number_to_get, // 0 = return all
              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;
}
//Classes restricted to same time block on all scheduled days,
//starting on the hour
struct ClassSchedule
{
       Days class_days; // bitmask of days
       unsigned short start_hour; // whole hours in military time
       unsigned short duration; // minutes
};
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;
};
//The Registrar interface is the main interface that allows
//students to access the database.
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
       );
};
// The RegistrarFactory interface finds Registrar interfaces.
interface RegistrarFactory
{
       Registrar find_registrar(
       );
};
 
ステップ2 :インタフェースのトランザクション・ポリシーの定義
トランザクション・ポリシーは、インタフェースごとに使用されます。設計時に、Oracle Tuxedoアプリケーション内のどのインタフェースでトランザクションを処理するかを決定します。表1-1では、CORBAトランザクション・ポリシーを説明しています。
 
表1-1 CORBAトランザクション・ポリシー
トランザクション・ポリシー
説明
always
インタフェースは常にトランザクションの一部である必要があります。インタフェースがトランザクションの一部ではない場合、トランザクションはTPフレームワークによって自動的に開始されます。
ignore
インタフェースはトランザクションに関与しません。ただし、トランザクションのスコープ内でこのインタフェースにリクエストを行うことはできます。このインタフェースのUBBCONFIGファイルで指定されるAUTOTRANパラメータは無視されます。
never
インタフェースはトランザクションに関与しません。このインタフェース用に作成されるオブジェクトは、トランザクションに関与できません。Oracle Tuxedoシステムは、このポリシーが設定されているインタフェースがトランザクションに関与した場合に例外(INVALID_TRANSACTION)を生成します。
optional
インタフェースはトランザクションに関与できます。リクエストがトランザクションに関係する場合、オブジェクトはトランザクションに関与できます。このトランザクション・ポリシーはデフォルトです。
開発中に、トランザクション・ポリシーを割り当てることで、トランザクション内で実行するインタフェースを決定します。トランザクション・ポリシーは、実装構成ファイル(ICF)で指定します。テンプレートのICFファイルは、genicfコマンドで作成します。ICFの詳細は、『CORBAプログラミング・リファレンス』の実装構成ファイル(ICF)に関する項を参照してください。
Transactionsサンプル・アプリケーションでは、Registrarインタフェースのトランザクション・ポリシーがalwaysに設定されます。
ステップ3 :サーバー・アプリケーションの記述
サーバー・アプリケーションでトランザクションを使用する場合は、インタフェースの操作を実装するメソッドを記述する必要があります。Transactionsサンプル・アプリケーションでは、register_for_courses()操作のメソッド実装を記述します。
Oracle Tuxedoアプリケーションでデータベースを使用する場合は、XAリソース・マネージャをオープンおよびクローズするサーバー・アプリケーション・コードを含める必要があります。それらの操作は、ServerオブジェクトのServer::initialize()操作とServer::release()操作に含められます。リスト1-2に、XAリソース・マネージャをオープンおよびクローズするTransactionsサンプル・アプリケーションのServerオブジェクトのコードの一部を示します。
注意:
トランザクションを実装するCORBAサーバー・アプリケーションの完全な例は、Oracle Tuxedoオンライン・ドキュメントのトランザクションのサンプルに関する項を参照してください。
リスト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();
}
//Utilities to manage transaction resource manager

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//cleanup not necessary
}
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ブートストラップ処理メカニズムの使用方法の詳細は、『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());
//Begin the transaction
var_transaction_current_oref->begin();
try {
//Perform the operation inside the transaction
    pointer_Registar_ref->register_for_courses(student_id, course_number_list);
     ...
//If operation executes with no errors, commit the transaction:
     CORBA::Boolean report_heuristics = CORBA_TRUE;
     var_transaction_current_ref->commit(report_heuristics);
    }
catch (...) {
//If the operation has problems executing, rollback the
//transaction. Then throw the original exception again.
//If the rollback fails, ignore the exception and throw the
//original exception again.
try {
     var_transaction_current_ref->rollback();
    }
catch (...) {
            TP::userlog("rollback failed");
            }
throw;
}
 
ステップ5 :構成ファイルの作成
トランザクション対応Oracle Tuxedoアプリケーションの構成ファイルに、次の情報を追加する必要があります。
GROUPSセクション:
OPENINFOパラメータに、データベースにリソース・マネージャをオープンするために必要な情報を指定します。この情報は、データベースの製品ドキュメントから取得します。com.beasys.Tobj.Server.initializeメソッドのデフォルト・バージョンにより、リソース・マネージャが自動的にオープンされます。
CLOSEINFOパラメータに、データベースのリソース・マネージャをクローズするために必要な情報を指定します。デフォルトでは、CLOSEINFOパラメータは空です。
TMSNAMEおよびTMSCOUNTパラメータを指定して、指定されたサーバー・グループにXAリソース・マネージャを関連付けます。
SERVERSセクションに、インタフェースを含むサーバー・アプリケーションと、データベースを管理するサーバー・アプリケーションの両方を含んだサーバー・グループを定義します。このサーバー・グループは、トランザクションとして指定する必要があります。
TLOGDEVICEパラメータに、トランザクション・ログ(TLOG)へのパス名を指定します。トランザクション・ログの詳細は、第5章「トランザクションの管理」を参照してください。
リスト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
 
トランザクション・ログおよび構成ファイルのパラメータ定義の詳細は、第5章「トランザクションの管理」を参照してください。

Copyright ©1994, 2017,Oracle and/or its affiliates. All rights reserved