CORBAトランザクションの使用

     前  次    新規ウィンドウで目次を開く  新規ウィンドウで索引を開く  PDFとして表示 - 新規ウィンドウ  Adobe Readerを入手 - 新規ウィンドウ
コンテンツはここから始まります

トランザクションの紹介

このトピックには次の項が含まれます:

注: 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では、ビジネス・トランザクションについて次のサポートが提供されます。

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

Oracle Tuxedo CORBAでは、エンタープライズ・アプリケーションの分散トランザクションと2フェーズ・コミット・プロトコルがサポートされます。分散トランザクションとは、複数のリソース・マネージャ(データベースなど)が調和的に更新されるトランザクションのことです。2フェーズ・コミット・プロトコル(2PC)は、複数のリソース・マネージャにまたがって1つのトランザクションを調整する手段です。これにより、トランザクションによる更新を関連するデータベースのすべてでコミットするか、すべてのデータベースから完全にロールバックし、トランザクション開始前の状態に戻すことで、データの整合性が保証されます。

 


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

トランザクションは次のリストで説明される状況に適しています。それぞれの状況は、Oracle Tuxedo CORBAでサポートされているトランザクション・モデルを説明しています。

 


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

図1-1に、Oracle 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ブートストラップ処理メカニズムによるトランザクションの使用方法

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

  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の詳細は、『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オンライン・ドキュメントのトランザクションのサンプルに関する項を参照してください。

開発手順

このトピックでは、トランザクション処理コードを含む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アプリケーションの構成ファイルに、次の情報を追加する必要があります。

リスト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

トランザクション・ログおよび構成ファイルのパラメータ定義の詳細は、「トランザクションの管理」を参照してください。


  先頭に戻る       前  次