目次 前 次 PDF


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

トランザクションについて
このトピックには次の項が含まれます:
注意:
Oracle Tuxedo CORBA環境でトランザクションを使用する方法の詳細は、『CORBAトランザクションの使用』を参照してください。
トランザクションとは
トランザクションとは、関連するアクションの集まりです。グローバル・トランザクションとは、複数のプログラムおよび複数のリソース・マネージャにまたがる関連アクションの集まりです。この章で使用する「トランザクション」は、グローバル・トランザクションを意味します。
トランザクションの単純な例として、銀行口座からの引出し処理があります。この処理では、一定の金額を引き出して預金残高の状態を変更する、という一連のアクションが行われます。このトランザクションの場合、システムは3つの操作で構成される手順を実行する必要があります。
 
これらの手順は、このトランザクションの実行専用に作成された個別のソフトウェア・モジュールによって実行されます。モジュールにトランザクションを起動および終了するコードが含まれるか、またはモジュールがこのようなコードを使用する必要があります。トランザクションを起動および終了するコード・セクションがメインのトランザクション・ソフトウェア・モジュールに含まれていない場合、これらは通常、別のモジュールにまとめてパッケージングされています。
トランザクション・コーディネータは、トランザクションに参加するすべてのリソース間で、トランザクションを管理するロジックを実行するソフトウェア・モジュールです。
ACIDプロパティとは
銀行口座の引出し処理といったトランザクションが実行される場合、構成する操作がすべて成功するか、すべて失敗するかのいずれかである必要があります。たとえば、トランザクションを構成する操作のうち、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.
tpbegin()を呼び出してトランザクションを開始します
2.
3.
tpcommit()を呼び出してトランザクションを終了します
グローバル・トランザクションの一部として、操作は1つの作業単位として実行されます。CUST_ORDERサービスが呼び出されると、サーバーにクライアントのトランザクションが伝播されます。その結果、発注データベースへのアクセスと、出荷用キューへの注文の登録は、クライアントのトランザクションの一部となります。
なんらかの原因でどちらかの操作が失敗すると、システム・エラーまたはアプリケーション・エラーが発生し、トランザクションの処理は元に戻され(ロールバックされ)ます。つまり、トランザクションは初期状態に戻ります。
一方、2つの操作が両方とも成功すると、クライアントはトランザクションをコミットします。つまり、トランザクションの結果を確定することを正式に通知します。これで、発注データベースへの更新は永続的となり、出荷部門に送信された注文は、その部門のキューに登録されます。
Oracle Tuxedoトランザクション・マネージャ(TM)とは
リソース・マネージャ(RM)は、データベース管理システムやApplication Queuing Managerのようなデータ・リポジトリであり、データにアクセスするためのツールを備えています。Oracle Tuxedoシステムは、1つまたは複数のRMを使用してアプリケーションの状態を管理します。たとえば、銀行の預金残高のレコードは、RMに保存されています。預金引出しサービスによってアプリケーションの状態が変わると、変更後の預金残高が、適切なRMに記録されます。
Oracle Tuxedoシステムでは、XAインタフェースをサポートするリソース・マネージャが関与するトランザクションを管理できますOracle Tuxedoシステムは、トランザクション・マネージャ(TM)として動作し、トランザクションに関連するすべての操作およびすべてのモジュールを調整します。
TMは、システム全体のリソースが関与するグローバル・トランザクションを調整します。ローカルのリソース・マネージャ(RM)は個別のリソースを担当します。トランザクション・マネージャ・サーバー(TMS)は、複数のリソースが関与するトランザクションを開始、コミットおよび中断します。アプリケーション・コードはRMへの通常の埋込みSQLインタフェースを使用して、読取りと更新を実行します。TMSはRMへのXAインタフェースを使用して、グローバル・トランザクションの処理を実行します。
表4-2は、個々のトランザクションのかわりにトランザクション・マネージャが行うアクションをまとめたものです。
 
グローバル・トランザクション識別子(GTRID)をトランザクションに割り当てます。
これらの通信相手を追跡します。
RMに適切なGTRIDを渡します。この結果、RMは、トランザクション処理でアクセスされるデータベース・レコードをモニターできます。
分散トランザクション処理を追跡する
Oracle Tuxedoのトランザクションは、分散型のアーキテクチャで使用できます。たとえば、トランザクションに関与するローカル・マシンがリモート・マシンと通信し、このリモート・マシンが、さらに別のリモート・マシンと通信できます。この種類の配置で実行されるトランザクションの処理は、分散トランザクション処理と呼ばれます。
システムでは、いつでもトランザクションをロールバック(初期状態に戻す)できるように、トランザクション情報を保持しておく必要があるため、分散トランザクション処理(DTP)の追跡は複雑になります。タスクを正常に実行するために、Oracle Tuxedoシステムは、トランザクションのすべての参加リソースに関する追跡情報を、トランザクション・ログ(TLOG)という専用のファイルに格納します。
図4-1に、2つのトランザクション・マネージャ(TM)が使用されるアプリケーションを示します。2つのTMはどちらも同じTLOGに追跡データを記録します。
図4-1 トランザクション管理
トランザクションをコミットする前に、TMは処理を続行するかどうかを尋ねる質問に繰り返し答える必要があります。必要な場合、TMはロールバックを決定します。
グローバル・トランザクション識別子(GTRID)を使用して追跡する
Oracle Tuxedoシステムは、分散システムで実行されているすべてのトランザクションのフローを追跡します。これには、同時に実行されているものも含まれます。トランザクションをコミットする段階になると、コーディネータは、トランザクションに参加していたため他のトランザクションと区別できる必要のあるRMを把握することが必要になります。このため、Oracle Tuxedoシステムは、各トランザクションにグローバル・トランザクション識別子(GTRID)を割り当てます。
Oracle Tuxedoシステムは、XAインタフェースを介してアプリケーションによってアクセスされるすべてのRMと通信します。RMは、ローカル・トランザクション識別子を割り当てることによってトランザクションを追跡し、グローバル識別子をローカル識別子にマッピングします。
トランザクション・ログ(TLOG)を使用して追跡する
グローバル・トランザクションは、コミットされるプロセスに含まれる場合にのみ、トランザクション・ログ(TLOG)に記録されます。TLOGには、2フェーズ・コミット・プロトコルの第1フェーズの最後に、グローバル・トランザクションの参加リソースからの応答が記録されます。
TLOGの記録があるということは、グローバル・トランザクションをコミットする必要があることを示します。ロールバックされるトランザクションは、TLOGに記録されません。
第1プリコミット・フェーズでは、各リソース・マネージャがコミットしてトランザクション・リクエストを実行する必要があります。すべてのパーティがコミットすると、トランザクション管理が第2フェーズを実行します。つまり、トランザクションをコミットして完了します。アプリケーション障害やシステム障害が原因でいずれかのタスクが失敗した場合、両方のタスクが失敗し、実行済の処理がその初期状態に戻され(ロールバックされ)ます。
グローバル・トランザクションを調整するTMSでは、TLOGファイルが使用されます。各マシンには、専用のTLOGが必要です。
アプリケーションでDomainsコンポーネントを使用している場合は、DomainsゲートウェイがDomainsグループのTMSの機能を果します。ただし、Domainsでは、Domains固有の情報のほか、TLOGの内容に似た情報を含む独自のトランザクション・ログを使用します。
Oracle DatabaseへのTLOGの書込み
OracleデータベースにTLOGを書き込むには、次の手順を実行する必要があります。
1.
Oracle Database 10gクライアント(以降)をインストールし、libclntsh.so.x.x (たとえば、libclntsh.so.10.1)のリンクlibclntsh.soを作成して、Linuxプラットフォームでリンクlibclntsh.soLD_LIBRARY_PATHを設定します。
2.
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"
3.
tmloadcfを実行し、TUXCONFIGを生成します。
4.
tmadminおよびdmadminコマンドを使用してTLOGを作成します。tmadminを使用したTLOGの作成の例は、次のとおりです。TLOGコマンドcrlogを実行すると、表が作成されます。UBBCONFIGTLOGNAMEで定義した値が表名になります。
$ tmadmin
$ crlog -m <Machine>
次の点に注意してください。
OracleデータベースにのみTLOGを書き込むことができます。サードパーティのデータベースはサポートされていません。
tmadminコマンドcrdlを使用してTLOGを作成する必要はありません。
TLOGDEVICE/DMTLOGDEVはOracleデータベース・スキーマを指し、Tuxedoでデータベース・ストレージ・デバイスとして処理されます。
UBBCONFIG内のTLOGNAMEのルールを次に示します。
UBBCONFIGTLOGNAMEは空にできません。複数のTLOGファイルがデータベースの同一スキーマに格納されている場合、DBAはTLOGNAMEが各TLOGについて一意であるようにする必要があります。そうすると、TuxedoでTLOGに対してTLOGNAMEで指定されたデータベース表に排他的にアクセスされます。
Tuxedoで予約されているため、TLOGNAMEQSまたはTUXでは始めないでください。DBAは、そのことを保証する必要があります。
TLOG2DBを使用する場合は、TLOGNAMEを大文字にします。
2フェーズ・コミットを使用してトランザクションをコミットする
2フェーズ・コミットとは、コミットするトランザクションの整合性を確保するためのアルゴリズムです。
このアルゴリズムのしくみを理解するために、次の例を考えてみます。6人の友人グループで1週間の休暇用に家を借りるとします。賃料の6分の1以上を支払えるグループ・メンバーはいません。6人のいずれかが参加できなくなった場合、家を借りることができなくなります。
1.
2.
2フェーズ・トランザクションのコミット処理も、この計画と同じように実行されます。
1.
2.
トランザクションの影響を処理する
アプリケーション・モジュールが別のモジュールから呼び出され、トランザクションに参加することを、トランザクションの影響を受けると表現します。アプリケーション・モジュールが影響を受けると、Oracle Tuxedoシステムはすべての参加リソースを追跡して、2フェーズ・コミットに関連付ける参加リソースを決定します。図4-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の特徴は、次のとおりです。
a.
トランザクションの影響を受けます
b.
c.
tpreturn()を呼び出します
d.
3.
Client_1は、tpcall()を使用してService_Bを呼び出します。Service_Bの特徴は、次のとおりです。
a.
トランザクションの影響を受けます
b.
c.
tpreturn()を呼び出します
d.
4.
Client_1は、tpcall()を使用してService_Cを呼び出します。Service_Cの特徴は、次のとおりです。
a.
トランザクションの影響を受けます
b.
c.
tpreturn()を呼び出します
d.
5.
Client_1は、tpcommit()を使用して、コミットのプロセスを開始します。
トランザクションの処理中に、呼び出されたサービスが別のサービスを実行しているか、または開かれた状態の会話に関連付けられている場合、ATMIはそのアクティビティを追跡し、アクティビティが完了するまでプロセスがコミットされないようにします。
ATMIでは、呼び出されたすべてのサービスによるトランザクションの処理の実行が成功した場合にのみ、トランザクションがコミットされます。すべての処理が成功すると、トランザクション・マネージャは、トランザクション内で実行されたすべての更新が確定されたことをリソース・マネージャに通知します。
関連項目
『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』グローバル・トランザクションのコーディングに関する項
『Oracle Tuxedo ATMIの紹介』ATMIの使用に関する項
Oracle Tuxedo CORBA環境でトランザクションを使用する方法の詳細は、『CORBAトランザクションの使用』を参照してください

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