bea ホーム | 製品 | dev2dev | support | askBEA
BEA Logo Tuxedo
 ドキュメントのダウンロード   サイトマップ   用語集 
検索
0

Tuxedo アプリケーションの設定

 Previous Next Contents View as PDF  

トランザクションについて

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

注記 BEA Tuxedo CORBA 環境でトランザクションを使用する方法については、『BEA Tuxedo CORBA トランザクション』を参照してください。

 


トランザクションとは

トランザクションとは、関連するアクションの集まりです。グローバル・トランザクションとは、複数のプログラムおよび複数のリソース・マネージャにまたがる関連アクションの集まりです。この章で使用する「トランザクション」は、グローバル・トランザクションを意味します。

トランザクションの単純な例として、銀行口座からの引き出し処理があります。この処理では、一定の金額を引き出して預金残高の状態を変更する、という一連のアクションが行われます。このトランザクションでは、次の 3 つの操作を含む手順を実行する必要があります。

トランザクションの手順

銀行口座の引き出し処理の手順

1. 実行するアクティビティを確認します。

1. 引き出し処理を行うかどうかを確認します。

2. トランザクションの処理を実行します。

2. 口座から指定された金額を引き出します。

3. 完了した処理の永続的なレコードを作成します。

3. 預金残高のレコードを更新します。

これらの処理は、このトランザクション専用に作成されたソフトウェア・モジュールによって実行されます。このモジュールには、トランザクションを開始および終了するコードも必要です。トランザクションの開始および終了を示すコード部分が、トランザクションのソフトウェア・モジュールの主要な部分ではない場合、これらのコード部分は通常、別のモジュールにパッケージ化されます。

トランザクション・コーディネータは、トランザクションに参加するリソース間で、トランザクションを管理するロジックを実行するソフトウェア・モジュールです。

ACID 特性とは

銀行口座からの引き出し処理などのトランザクションでは、トランザクションを構成する操作がすべて成功するか、またはすべて失敗しなければなりません。たとえば、トランザクションを構成する操作のうち、1 つの操作が成功し、別の操作が失敗するとします。つまり、銀行口座から預金を引き出しても、引き出し後の金額が預金残高に反映されないとすれば、その銀行は営業を続けることができません。

トランザクションを構成する操作は、すべて成功するか、または失敗しなければならない、という特性を「原子性」と言います。BEA Tuxedo システムのすべてのトランザクションは、原子性という特性を持ち、さらに、「一貫性」、「独立性」、および「持続性」という関連する特性を備えています。BEA Tuxedo システムで実行されるトランザクションのこうした 4 つの属性を ACID 特性と呼びます。

表 0-4 BEA Tuxedo トランザクションの ACID 特性

特性

意味

原子性

トランザクションは個別の作業単位であり、トランザクションを構成する操作はすべて成功するか、または失敗しなければなりません。この種の操作には、キューへのメッセージの登録、データベースの更新、およびトランザクション結果の画面表示などがあります。

一貫性

トランザクションは、正しい状態のままシステムを終了するか、またはアボートしなければなりません。トランザクションの状態が不安定な場合は、初期状態に戻らなければなりません。

独立性

トランザクションの動作は、同時に実行されているほかのトランザクションによる影響を受けません。トランザクションでは、共用リソースへのアクセスをシリアル化しなければならず、同時に実行されるプログラムがお互いの操作を妨害しないことが保証されなければなりません。

持続性

コミットされたトランザクションの結果は永続的です。システムが異常終了しても、トランザクションによって行われた変更は永続し、持続します。

トランザクションの成功と失敗

状況

結果

トランザクション内のいずれかの操作が何らかの原因で失敗した場合

トランザクション内のすべての操作が成功した場合

クライアントは、トランザクションをコミットします。つまり、トランザクションを終了できる状態になり、結果を保存する必要があることを正式に通知します。たとえば、発注データベースの更新が永続化されると、出荷部門に送られた注文は、その部門のキューに永続的なレコードとして登録されます。

トランザクションの成功または失敗は、原子性の要件によって決まります。

 


トランザクションの利点

BEA Tuxedo システム、およびその通信 API とプロトコルは、トランザクションを使用するように設計されています。BEA Tuxedo の通信呼び出しを使用すると、トランザクションを簡単に作成することができ、分散アプリケーションの作成には不可欠なツールです。

トランザクションを使用すると、以下のことが可能になります。

 


グローバル・トランザクションの例

電子商取引を行う小売店が、CUST_ORDER というサービスを使用するとします。顧客がその小売店の Web サイトで注文を行うと、CUST_ORDER サービスにより次の 2 つの操作が実行されます。

小売店側では、CUST_ORDER サービスを原子性の原則に従って実行する必要があります。つまり、CUST_ORDER が実行された場合、データベースの更新および出荷部門のキューへの要求の登録が両方とも成功しなければなりません。CUST_ORDER サービスが常に原子性に基づいて処理されるようにするため、CUST_ORDER を呼び出すクライアントは、要求をグローバル・トランザクションに関連付けます。

クライアントは、サービスをグローバル・トランザクションに関連付けるため、次の手順に従います。

  1. tpbegin() を呼び出してトランザクションを開始します。

  2. サービス要求を発行します。

  3. tpcommit() を呼び出してトランザクションを終了します。

操作は、1 つの作業単位で、グローバル・トランザクションの一環として実行されます。CUST_ORDER サービスが呼び出されると、サーバにクライアントのトランザクションが複製転送されます。その結果、発注データベースへのアクセスと、出荷用キューへの注文の登録は、クライアントのトランザクションの一部となります。

何らかの原因でどちらかの操作が失敗すると、システム・エラーまたはアプリケーション・エラーが発生し、トランザクションの作業は元に戻され (ロールバックされ) ます。つまり、トランザクションは初期状態に戻ります。

一方、2 つの操作が両方とも成功すると、クライアントはトランザクションをコミットします。つまり、トランザクションの結果を確定することを正式に通知します。これで、発注データベースへの更新は永続的となり、出荷部門に送信された注文は、その部門のキューに登録されます。

 


BEA Tuxedo トランザクション・マネージャ (TM) とは

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

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

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

次の表は、個々のトランザクションの代わりに TM が行うアクションをまとめたものです。

表 0-5 トランザクション・マネージャが実行するアクション

状況

トランザクション・マネージャのアクション

アプリケーションがトランザクションを開始した場合

グローバル・トランザクション識別子 (GTRID) をトランザクションに割り当てます。

ほかのプロセスが、トランザクションを開始したプロセスと通信する場合

通信相手のプロセスをトラッキングします。

トランザクション処理の一環として RM へのアクセスが行われる場合

RM に適切な GTRID を渡します。この結果、RM は、トランザクション処理でアクセスされるデータベース・レコードを監視できます。

アプリケーションからトランザクションのコミットが通知された場合

2 フェーズ・コミット・プロトコルを実行します。具体的には、以下を実行します。
(a) フェーズ 1 の実行中に、通信相手とコンタクトします。(b) フェーズ 1 が成功したことをログに記録します。
(c) フェーズ 2 で通信相手とコンタクトします。

アプリケーションからトランザクションのアボートが通知された場合

ロールバック手順を実行します。

障害が発生した場合

障害を回復します。

 


分散トランザクション処理をトラッキングする

BEA Tuxedo のトランザクションは、分散型のアーキテクチャで使用できます。たとえば、トランザクションに関与するローカル・マシンがリモート・マシンと通信し、このリモート・マシンが、さらに別のリモート・マシンと通信することができます。このようなしくみで実行されるトランザクション処理を、分散トランザクション処理と呼びます。

システムでは、いつでもトランザクションをロールバック (初期状態に戻す) できるように、トランザクション情報を保持しておく必要があるため、分散トランザクション処理 (DTP) のトラッキングは複雑になります。この処理を正しく実行するため、BEA Tuxedo システムは、トランザクション・ログ (TLOG) と呼ばれる専用のファイルに、トランザクションのパーティシパントすべてのトラッキング情報を格納します。

次の図は、2 つのトランザクション・マネージャ (TM) を使用するアプリケーションの例を示しています。2 つの TM はどちらも同じ TLOG にトラッキング・データを記録します。

図 4-1 トランザクション管理


 

トランザクションをコミットする前に、TM は処理を続行するかどうかを尋ねる質問に繰り返し答える必要があります。必要に応じて、TM はロールバックを行います。

グローバル・トランザクション識別子 (GTRID) を使用してトラッキングする

BEA Tuxedo システムは、同時に実行されるトランザクションを含め、分散システム内で実行されるすべてのトランザクションのフローをトラッキングします。トランザクションのコミット時には、コーディネータ側でトランザクションに参加する RM を認識していなければならないため、各トランザクションは識別できる状態でなければなりません。このため、BEA Tuxedo システムは、各トランザクションにグロ―バル・トランザクション識別子 (GTRID) を割り当てます。

BEA Tuxedo システムは、XA インターフェイスを介して、アプリケーションがアクセスする RM と通信します。RM は、ローカル・トランザクション識別子を割り当てることによってトランザクションをトラッキングし、グローバル識別子をローカル識別子にマッピングします。

トランザクション・ログ (TLOG) を使用してトラッキングする

グローバル・トランザクションは、コミットされるプロセスに含まれる場合にのみ、トランザクション・ログ (TLOG) に記録されます。TLOG には、2 フェーズ・コミット・プロトコルの第 1 フェーズの最後に、グローバル・トランザクションのパーティシパントからの応答が記録されます。

TLOG の記録があるということは、グローバル・トランザクションをコミットしなければならないことを示します。ロールバックされるトランザクションは、TLOG に記録されません。

最初の「プリコミット」フェーズでは、各リソース・マネージャでトランザクション要求の実行をコミットします。すべてのリソース・マネージャでトランザクションがコミットされると、トランザクション・マネージャは、第 2 フェーズを実行します。つまり、トランザクションはコミットされ、終了します。アプリケーション障害またはシステムの障害により、どちらかのタスクが失敗すると、タスクは両方共失敗し、実行済みの処理は取り消される、つまり初期状態に「ロールバック」されます。

グローバル・トランザクションの調節を行う TMS では、TLOG ファイルが使用されます。各マシンには、専用の TLOG が必要です。

アプリケーションで Domains コンポーネントを使用している場合は、Domains ゲートウェイが TMS の機能を果たします。ただし、Domains では、Domains 固有の情報のほか、TLOG の内容に似た情報を含む独自のトランザクション・ログを使用します。

 


2 フェーズ・コミットを使用してトランザクションをコミットする

2 フェーズ・コミットとは、トランザクションのコミットを確実に行うためのアルゴリズムです。

このアルゴリズムのしくみをわかりやすく説明するため、次の状況を例にとります。6 人の仲間が、家を 1 週間借りて休暇を過ごす予定を立てているとします。6 人共、それぞれ賃料の 6 分の 1 の金額しか負担できません。つまり、6 人のうち誰かが参加できないと、家を借りることはできなくなります。

  1. この計画の第 1 フェーズでは、幹事が出席を確認し、すべてのメンバから 6 分の 1 の賃料を集金します。1 人でも欠席者が出たら、幹事はグループのすべてのメンバに連絡し、家を借りることができなくなったことを伝えます。ただし、すべてのメンバの出席が確認でき、6 人分の賃料を徴収できれば、第 1 フェーズは成功します。

  2. 第 2 フェーズでは、幹事はグループのすべてのメンバに対し、計画が予定どおりに行われることを通知します。

2 フェーズ・トランザクションのコミット処理も、この計画と同じように実行されます。

  1. 第 1 フェーズでは、トランザクション・コーディネータがトランザクションに参加する可能性があるパーティシパントにコンタクトします。すべてのパーティシパントは、トランザクションの結果の確定に同意しますが、すぐには行いません。パーティシパントは、情報をディスクに記録し、第 2 フェーズを完了できるようにします。すべてのパーティシパントがコミットに同意すると、トランザクション・コーディネータはそれを記録し、結果は確定されます。パーティシパントの同意がログに記録されると、第 1 フェーズは終了します。

  2. 第 2 フェーズでは、コーディネータは各パーティシパントに決定を通知し、リソースへの更新を確定します。

トランザクションの影響を処理する

アプリケーション・モジュールが別のモジュールから呼び出され、トランザクションに参加することを、トランザクションの影響といいます。アプリケーション・モジュールが影響を受けると、BEA Tuxedo システムはすべてのパーティシパントをトラッキングして、第 2 フェーズに関連付けるパーティシパントを決定します。次の図は、システムがパーティシパントをトラッキングする方法を示します。

図 4-2 トランザクション上の影響


 

この図では、クライアント 1 がトランザクションを開始し、A、B、C の 3 つのサービスを呼び出しています。サービス A、B、C は、トランザクションの開始後に呼び出されたため、トランザクションの影響を受けています。サーバ A、B、C によって実行される作業はすべて、クライアント 1 によって開始されたトランザクションの一部です。すべての作業は、1 つの単位で実行され、すべてが成功するか、または失敗して tpabort の呼び出しによりロールバックされるかのどちらかになります。トランザクションが失敗すると、初期状態に戻り、リソース・マネージャ上のトランザクションの結果は元に戻されます。トランザクション内で認識されていないリソース・マネージャや、トランザクション外からアクセスされたリソース・マネージャは、ロールバックできません。

ATMI を使用して 2 フェーズ・コミットの前にトランザクションの整合性を確保する

トランザクションに関わる各リソースで実行される作業は、2 フェーズ・コミットを開始する前に、すべて終了していなければなりません。ATMI を使用すると、2 フェーズ・コミット・プロトコルの開始時に、すべてのトランザクション作業を中止できます。

次に、2 フェーズ・コミットを実行する前に、ATMI を使用してトランザクション処理を中止する手順を示します。

  1. Client_1 は tpbegin() を使ってトランザクションを開始します。

  2. Client_1 は、tpcall() を使用して Service_A を呼び出します。Service_A の特徴は、以下のとおりです。

    1. トランザクションの影響を受けます。

    2. 操作を実行します。

    3. tpreturn() を呼び出します。

    4. トランザクション処理を終了します。

  3. Client_1 は、tpcall() を使用して Service_B を呼び出します。Service_B の特徴は、以下のとおりです。

    1. トランザクションの影響を受けます。

    2. 操作を実行します。

    3. tpreturn() を呼び出します。

    4. トランザクション処理を終了します。

  4. Client_1 は、tpcall() を使用して Service_C を呼び出します。Service_C の特徴は、以下のとおりです。

    1. トランザクションの影響を受けます。

    2. 操作を実行します。

    3. tpreturn() を呼び出します。

    4. トランザクション処理を終了します。

  5. Client_1 は、tpcommit() を使用して、コミットのプロセスを開始します。

トランザクションの処理中に、呼び出されたサービスが別のサービスを実行しているか、またはオープン中の会話に関連付けられている場合、ATMI はそのアクティビティをトラッキングし、アクティビティが完了するまでプロセスがコミットされないようにします。

ATMI は、呼び出されたすべてのサービスによるトランザクション処理が成功した場合にのみ、トランザクションをコミットします。すべての処理が成功すると、トランザクション・マネージャは、トランザクション内で実行されたすべての更新が確定されたことをリソース・マネージャに通知します。

関連項目

 

Back to Top Previous Next
Contact e-docsContact BEAwebmasterprivacy