注: | Oracle Tuxedo CORBA環境でトランザクションを使用する方法については、『CORBAトランザクションの使用』を参照してください。 |
トランザクションとは、関連するアクションの集まりです。グローバル・トランザクションとは、複数のプログラムおよび複数のリソース・マネージャにまたがる関連アクションの集まりです。この章で使用する「トランザクション」は、グローバル・トランザクションを意味します。
トランザクションの単純な例として、銀行口座からの引出し処理があります。この処理では、一定の金額を引き出して預金残高の状態を変更する、という一連のアクションが行われます。このトランザクションでは、次の3つの操作を含む手順を実行する必要があります。
これらの処理は、このトランザクション専用に作成されたソフトウェア・モジュールによって実行されます。このモジュールには、トランザクションを開始および終了するコードも必要です。トランザクションの開始および終了を示すコード部分が、トランザクションのソフトウェア・モジュールの主要な部分ではない場合、これらのコード部分は通常、別のモジュールにパッケージ化されます。
トランザクション・コーディネータは、トランザクションに参加するリソース間で、トランザクションを管理するロジックを実行するソフトウェア・モジュールです。
銀行口座からの引出し処理などのトランザクションでは、トランザクションを構成する操作がすべて成功するか、またはすべて失敗しなければなりません。たとえば、トランザクションを構成する操作のうち、1つの操作が成功し、別の操作が失敗するとします。つまり、銀行口座から預金を引き出しても、引出し後の金額が預金残高に反映されないとすれば、その銀行は営業を続けることができません。
トランザクションを構成する操作がすべて成功するかまたは失敗するというルールを順守するトランザクションは、原子性という特性を持ちます。Oracle Tuxedoシステムでは、すべてのトランザクションは、原子性に加えて、一貫性、独立性、耐久性という3つの関連する特性を持つことが求められます。Oracle Tuxedoシステムで実行されるトランザクションのこうした4つの属性をACIDプロパティと呼びます。
表4-1に、Oracle Tuxedoトランザクションの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インタフェースをサポートするリソース・マネージャが関与するトランザクションを管理するのに役立ちます。Oracle Tuxedoシステムは、トランザクション・マネージャ(TM: Transaction Manager)として動作し、トランザクションに関連するすべての操作およびすべてのモジュールを調整します。
TMは、システム全体に渡るリソースが関与するグローバル・トランザクションを調整します。個々のリソースは、ローカルのリソース・マネージャ(RM)によって管理されます。トランザクション・マネージャ・サーバー(TMS: Transaction Manager Server)は、複数のリソースに関与するトランザクションの開始、コミット、および中断を行います。アプリケーション・コードは、RMに対して標準の埋め込み型SQLインタフェースを使用し、読み取りや更新を行います。TMSは、RMに対してXAインタフェースを使用し、グローバル・トランザクション操作を実行します。
表4-2は、個々のトランザクションのかわりにトランザクション・マネージャが行うアクションをまとめたものです。
Oracle Tuxedoのトランザクションは、分散型のアーキテクチャで使用できます。たとえば、トランザクションに関与するローカル・マシンがリモート・マシンと通信し、このリモート・マシンが、さらに別のリモート・マシンと通信することができます。このようなしくみで実行されるトランザクション処理を、分散トランザクション処理と呼びます。
システムでは、いつでもトランザクションをロールバック(初期状態に戻す)できるように、トランザクション情報を保持しておく必要があるため、分散トランザクション処理(DTP)の追跡は複雑になります。この処理を正しく実行するため、Oracle Tuxedoシステムは、トランザクション・ログ(TLOG
)と呼ばれる専用のファイルに、トランザクションの参加リソースすべての追跡情報を格納します。
図4-1は、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
の内容に似た情報を含む独自のトランザクション・ログを使用します。
OracleデータベースにTLOG
を書き込むには、次の手順を実行する必要があります。
libclntsh.so.x.x
(例えば、libclntsh.so.10.1
)のlibclntsh.so
リンクを作成して、Linuxプラットフォームでlibclntsh.so
リンクをLD_LIBRARY_PATH
を設定します。DB:Oracle_XA: …
」という形式を使用して、UBBCONFIG(5) TLOGDEVICE
またはDMCONFIG(5) DMTLOGDEV
を設定します。例: TLOGDEVICE="DB:Oracle_XA:ORACLE_XA+SqlNet=ORCL+ACC=P/scott/tiger"
DMTLOGDEV="DB:Oracle_XA:ORACLE_XA+SqlNet=ORCL+ACC=P/scott/tiger"
tmloadcf
を実行し、TUXCONFIG
を生成します。tmadmin
およびdmadmin
コマンドを使用してTLOG
を作成します。tmadmin
を使用したTLOG
の作成の例は、次のとおりです。TLOG
コマンドcrlog
を実行すると、表が作成されます。UBBCONFIG
のTLOGNAME
で定義した値が表名になります。$ tmadmin
$ crlog -m <Machine>
TLOG
はOracleデータベースにのみ書き込むことができます。サードパーティのデータベースはサポートされていません。tmadmin
コマンドcrdl
を使用してTLOG
を作成する必要はありません。TLOGDEVICE/DMTLOGDEV
はOracleデータベース・スキーマを指し、Tuxedoでデータベース・ストレージ・デバイスとして処理されます。 UBBCONFIG
内のTLOGNAME
のルールを次に示します。UBBCONFIG
のTLOGNAME
は空にできません。複数のTLOG
ファイルがデータベースの同一スキーマに格納されている場合、DBAはTLOGNAME
が各TLOG
について一意であるようにする必要があります。そうすると、TuxedoでTLOG
に対してTLOGNAME
で指定されたデータベース表に排他的にアクセスされます。TLOGNAME
は"QS
"または"TUX
"では始めないでください。DBAは、そのことを保証する必要があります。TLOG2DB
を使用する場合は、TLOGNAME
を大文字にします。
2フェーズ・コミットとは、コミットするトランザクションの整合性を確保するためのアルゴリズムです。
このアルゴリズムのしくみをわかりやすく説明するため、次の状況を例に取ります。6人の仲間が、家を1週間借りて休暇を過ごす予定を立てているとします。6人共、それぞれ賃料の6分の1の金額しか負担できません。つまり、6人のうち誰かが参加できないと、家を借りることはできなくなります。
2フェーズ・トランザクションのコミット処理も、この計画と同じように実行されます。
アプリケーション・モジュールが別のモジュールから呼び出され、トランザクションに参加することを、トランザクションの影響を受けるといいます。アプリケーション・モジュールが影響を受けると、Oracle Tuxedoシステムはすべての参加リソースを追跡して、2フェーズ・コミットに関連付ける参加リソースを決定します。図4-2は、システムが参加リソースを追跡する方法を示します。
この図では、クライアント1がトランザクションを開始し、A、B、Cの3つのサービスを呼び出しています。サービスA、B、Cは、トランザクションの開始後に呼び出されたため、トランザクションの影響を受けています。サーバーA、B、Cによって実行される作業はすべて、クライアント1によって開始されたトランザクションの一部です。すべての作業は、1つの単位で実行され、すべてが成功するか、または失敗してtpabort
の呼出しによりロールバックされるかのどちらかになります。トランザクションが失敗すると、初期状態に戻り、リソース・マネージャ上のトランザクションの結果は元に戻されます。(トランザクション内で認識されていないリソース・マネージャや、トランザクション外からアクセスされたリソース・マネージャは、ロールバックできません。)
トランザクションに関わる各リソースで実行される作業は、2フェーズ・コミットを開始する前に、すべて終了していなければなりません。ATMIを使用すると、2フェーズ・コミット・プロトコルの開始時に、すべてのトランザクション作業を中止できます。
次に、2フェーズ・コミットを実行する前に、ATMIを使用してトランザクション処理を中止する手順を示します。
トランザクションの処理中に、呼び出されたサービスが別のサービスを実行しているか、または開かれた状態の会話に関連付けられている場合、ATMIはそのアクティビティを追跡し、アクティビティが完了するまでプロセスがコミットされないようにします。
ATMIは、呼び出されたすべてのサービスによるトランザクション処理が成功した場合にのみ、トランザクションをコミットします。すべての処理が成功すると、トランザクション・マネージャは、トランザクション内で実行されたすべての更新が確定されたことをリソース・マネージャに通知します。