|
注意 : | Oracle Tuxedo CORBA 環境でトランザクションを使用する方法については、『Tuxedo CORBA トランザクション』を参照してください。 |
トランザクションとは、関連するアクションの集まりです。グローバル トランザクションとは、複数のプログラムおよび複数のリソース マネージャにまたがる関連アクションの集まりです。この章で使用する「トランザクション」は、グローバル トランザクションを意味します。
トランザクションの単純な例として、銀行口座からの引き出し処理があります。この処理では、一定の金額を引き出して預金残高の状態を変更する、という一連のアクションが行われます。このトランザクションでは、次の 3 つの操作を含む手順を実行する必要があります。
これらの処理は、このトランザクション専用に作成されたソフトウェア モジュールによって実行されます。このモジュールには、トランザクションを開始および終了するコードも必要です。トランザクションの開始および終了を示すコード部分が、トランザクションのソフトウェア モジュールの主要な部分ではない場合、これらのコード部分は通常、別のモジュールにパッケージ化されます。
トランザクション コーディネータは、トランザクションに参加するリソース間で、トランザクションを管理するロジックを実行するソフトウェア モジュールです。
銀行口座からの引き出し処理などのトランザクションでは、トランザクションを構成する操作がすべて成功するか、またはすべて失敗しなければなりません。たとえば、トランザクションを構成する操作のうち、1 つの操作が成功し、別の操作が失敗するとします。つまり、銀行口座から預金を引き出しても、引き出し後の金額が預金残高に反映されないとすれば、その銀行は営業を続けることができません。
トランザクションを構成する操作は、すべて成功するか、または失敗しなければならない、という特性を「原子性」と言います。Oracle Tuxedo システムのすべてのトランザクションは、原子性という特性を持ち、さらに、「一貫性」、「隔離性」、および「持続性」という関連する特性を備えています。Oracle Tuxedo システムで実行されるトランザクションのこうした 4 つの属性を ACID 特性と呼びます。
トランザクションの成功または失敗は、原子性の要件によって決まります。
Oracle Tuxedo システム、およびその通信 API とプロトコルは、トランザクションを使用するように設計されています。Oracle Tuxedo の通信呼び出しを使用すると、トランザクションを簡単に作成することができ、分散アプリケーションの作成には不可欠なツールです。
電子商取引を行う小売店が、CUST_ORDER
というサービスを使用するとします。顧客がその小売店の Web サイトで注文を行うと、CUST_ORDER
サービスにより次の 2 つの操作が実行されます。
小売店側では、CUST_ORDER
サービスを原子性の原則に従って実行する必要があります。つまり、CUST_ORDER
が実行された場合、データベースの更新および出荷部門のキューへの要求の登録が両方とも成功しなければなりません。CUST_ORDER
サービスが常に原子性に基づいて処理されるようにするため、CUST_ORDER
を呼び出すクライアントは、要求をグローバル トランザクションに関連付けます。
クライアントは、サービスをグローバル トランザクションに関連付けるため、次の手順に従います。
操作は、1 つの作業単位で、グローバル トランザクションの一環として実行されます。CUST_ORDER
サービスが呼び出されると、サーバにクライアントのトランザクションが伝播されます。その結果、発注データベースへのアクセスと、出荷用キューへの注文の登録は、クライアントのトランザクションの一部となります。
何らかの原因でどちらかの操作が失敗すると、システム エラーまたはアプリケーション エラーが発生し、トランザクションの作業は元に戻され (ロールバックされ) ます。つまり、トランザクションは初期状態に戻ります。
一方、2 つの操作が両方とも成功すると、クライアントはトランザクションをコミットします。つまり、トランザクションの結果を確定することを正式に通知します。これで、発注データベースへの更新は永続的となり、出荷部門に送信された注文は、その部門のキューに登録されます。
リソース マネージャ (RM: Resource Manager) は、データベース管理システムや Application Queuing Manager のようなデータ リポジトリであり、データにアクセスするためのツールを備えています。Oracle Tuxedo システムは、1 つまたは複数の RM を使用してアプリケーションの状態を管理します。たとえば、銀行の預金残高のレコードは、RM に保存されています。預金引き出しサービスによってアプリケーションの状態が変わると、変更後の預金残高が、適切な RM に記録されます。
Oracle Tuxedo システムは、XA インタフェース対応の RM が関与するトランザクションを管理するのに役立ちます。Oracle Tuxedo システムは、トランザクション マネージャ (TM: Transaction Manager) として動作し、トランザクションに関連するすべての操作およびすべてのモジュールを調整します。
TM は、システム全体に渡るリソースが関与するグローバル トランザクションを調整します。個々のリソースは、ローカルのリソース マネージャ (RM) によって管理されます。トランザクション マネージャ サーバ (TMS: Transaction Manager Server) は、複数のリソースに関与するトランザクションの開始、コミット、およびアボートを行います。アプリケーション コードは、RM に対して標準の埋め込み型 SQL インタフェースを使用し、読み取りや更新を行います。TMS は、RM に対して XA インタフェースを使用し、グローバル トランザクション操作を実行します。
次の表は、個々のトランザクションの代わりに TM が行うアクションをまとめたものです。
Oracle Tuxedo のトランザクションは、分散型のアーキテクチャで使用できます。たとえば、トランザクションに関与するローカル マシンがリモート マシンと通信し、このリモート マシンが、さらに別のリモート マシンと通信することができます。このようなしくみで実行されるトランザクション処理を、分散トランザクション処理と呼びます。
システムでは、いつでもトランザクションをロールバック (初期状態に戻す) できるように、トランザクション情報を保持しておく必要があるため、分散トランザクション処理 (DTP) の追跡は複雑になります。この処理を正しく実行するため、Oracle Tuxedo システムは、トランザクション ログ (TLOG
) と呼ばれる専用のファイルに、トランザクションの参加リソースすべての追跡情報を格納します。
次の図は、2 つのトランザクション マネージャ (TM) を使用するアプリケーションの例を示しています。2 つの TM はどちらも同じ TLOG
に追跡データを記録します。
トランザクションをコミットする前に、TM は処理を続行するかどうかを尋ねる質問に繰り返し答える必要があります。必要に応じて、TM はロールバックを行います。
Oracle Tuxedo システムは、同時に実行されるトランザクションを含め、分散システム内で実行されるすべてのトランザクションのフローを追跡します。トランザクションのコミット時には、コーディネータ側でトランザクションに参加する RM を認識していなければならないため、各トランザクションは識別できる状態でなければなりません。このため、Oracle Tuxedo システムは、各トランザクションにグローバル トランザクション識別子 (GTRID
) を割り当てます。
Oracle Tuxedo システムは、XA インタフェースを介して、アプリケーションがアクセスする RM と通信します。RM は、ローカル トランザクション識別子を割り当てることによってトランザクションを追跡し、グローバル識別子をローカル識別子にマップします。
グローバル トランザクションは、コミットされるプロセスに含まれる場合にのみ、トランザクション ログ (TLOG
) に記録されます。TLOG
には、2 フェーズ コミット プロトコルの第 1 フェーズの最後に、グローバル トランザクションの参加リソースからの応答が記録されます。
TLOG
の記録があるということは、グローバル トランザクションをコミットしなければならないことを示します。ロールバックされるトランザクションは、TLOG
に記録されません。
最初の「プリコミット」フェーズでは、各リソース マネージャでトランザクション要求の実行をコミットします。すべてのリソース マネージャでトランザクションがコミットされると、トランザクション マネージャは、第 2 フェーズを実行します。つまり、トランザクションはコミットされ、終了します。アプリケーション障害またはシステムの障害により、どちらかのタスクが失敗すると、タスクは両方共失敗し、実行済みの処理は取り消される、つまり初期状態に「ロールバック」されます。
グローバル トランザクションの調節を行う TMS
では、TLOG
ファイルが使用されます。各マシンには、専用の TLOG
が必要です。
アプリケーションで Domains コンポーネントを使用している場合は、Domains ゲートウェイが TMS
の機能を果たします。ただし、Domains では、Domains 固有の情報のほか、TLOG
の内容に似た情報を含む独自のトランザクション ログを使用します。
2 フェーズ コミットとは、トランザクションのコミットを確実に行うためのアルゴリズムです。
このアルゴリズムのしくみをわかりやすく説明するため、次の状況を例に取ります。6 人の仲間が、家を 1 週間借りて休暇を過ごす予定を立てているとします。6 人共、それぞれ賃料の 6 分の 1 の金額しか負担できません。つまり、6 人のうち誰かが参加できないと、家を借りることはできなくなります。
2 フェーズ トランザクションのコミット処理も、この計画と同じように実行されます。
アプリケーション モジュールが別のモジュールから呼び出され、トランザクションに参加することを、トランザクションの影響といいます。アプリケーション モジュールが影響を受けると、Oracle Tuxedo システムはすべての参加リソースを追跡して、第 2 フェーズに関連付ける参加リソースを決定します。次の図は、システムが参加リソースを追跡する方法を示します。
この図では、クライアント 1 がトランザクションを開始し、A、B、C の 3 つのサービスを呼び出しています。サービス A、B、C は、トランザクションの開始後に呼び出されたため、トランザクションの影響を受けています。サーバ A、B、C によって実行される作業はすべて、クライアント 1 によって開始されたトランザクションの一部です。すべての作業は、1 つの単位で実行され、すべてが成功するか、または失敗して tpabort
の呼び出しによりロールバックされるかのどちらかになります。トランザクションが失敗すると、初期状態に戻り、リソース マネージャ上のトランザクションの結果は元に戻されます。トランザクション内で認識されていないリソース マネージャや、トランザクション外からアクセスされたリソース マネージャは、ロールバックできません。
トランザクションに関わる各リソースで実行される作業は、2 フェーズ コミットを開始する前に、すべて終了していなければなりません。ATMI を使用すると、2 フェーズ コミット プロトコルの開始時に、すべてのトランザクション作業を中止できます。
次に、2 フェーズ コミットを実行する前に、ATMI を使用してトランザクション処理を中止する手順を示します。
トランザクションの処理中に、呼び出されたサービスが別のサービスを実行しているか、または開かれた状態の会話に関連付けられている場合、ATMI はそのアクティビティを追跡し、アクティビティが完了するまでプロセスがコミットされないようにします。
ATMI は、呼び出されたすべてのサービスによるトランザクション処理が成功した場合にのみ、トランザクションをコミットします。すべての処理が成功すると、トランザクション マネージャは、トランザクション内で実行されたすべての更新が確定されたことをリソース マネージャに通知します。