| Oracle Database アプリケーション開発者ガイド-基礎編 10gリリース2(10.2) B19248-02 |
|
この章では、Oracle XAライブラリの使用方法について説明します。通常、このライブラリはトランザクション・モニターで作業するアプリケーションで使用します。XAの機能は、トランザクションが複数のデータベースと相互処理するアプリケーションで最も効果的です。
この章の内容は次のとおりです。
X/Open Distributed Transaction Processing(DTP)アーキテクチャは、複数のアプリケーション・プログラム(AP)が複数の異なるリソース・マネージャ(RM)から提供されるリソースを共有できるようにするための、標準のアーキテクチャまたはインタフェースを定義しています。APとRM間の作業を調整し、グローバル・トランザクションを実現します。
Oracle XAライブラリは、X/Openソフトウェア・アーキテクチャのXAインタフェース仕様に準拠しています。Oracle XAライブラリは外部インタフェースであり、Oracle以外のクライアント側トランザクション・マネージャ(TM)がグローバル・トランザクションを調整可能にすることで分散トランザクションにOracle Database以外のRMを組み込めるようにします。たとえば、クライアント・アプリケーションでは、Oracle DatabaseトランザクションとNTFSファイル・システム内のトランザクションを1つのグローバル・トランザクションとして管理できます。
図15-1に、X/Open DTPモデルの例を示します。
この項では、分散トランザクション処理における重要な用語を紹介します。
リソース・マネージャは、障害発生後に通常の状態に戻すことができる共有かつリカバリ可能なリソースを制御します。たとえば、リレーショナル・データベース、トランザクション・キューおよびトランザクション・ファイル・システムなどです。Oracle DatabaseはRMであり、障害発生後にREDOログおよびロールバック・セグメントを使用して一貫性のある状態に復帰します。
分散トランザクションは、複数の分散リソースに対する更新を伴い、分散RM間で「すべてまたはなし」のセマンティクスを必要とするクライアント・トランザクションであり、グローバル・トランザクションとも呼ばれます。
ブランチは、1つのRMに含まれる1つの作業単位です。複数のブランチが1つのグローバル・トランザクションを構成します。Oracle Databaseの場合、各ブランチはデータベース・サーバー内のローカル・トランザクションにマップします。
トランザクション・マネージャは、トランザクション境界を指定するためのAPIを提供し、コミットおよびリカバリを管理します。TMでは、分散RM間で「すべてまたはなし」のセマンティクスを提供する2フェーズ・コミット・エンジンが実装されます。
外部TMとは、Oracle Databaseの外部に常駐する中間層コンポーネントです。通常、データベースには固有の内部TMがあります。業界標準に準拠したTMを使用することで、Oracle Databaseは単一のトランザクション内で他の異機種間RMと共存できます。
TMは、通常、TPMベンダーが提供します。TPMは、トランザクション要求を発行するクライアント・プロセスとその要求を処理するバックエンド・サーバー間の要求フローを調整します。TPMは、基本的にネットワーク上に分散されているアプリケーション・サーバーやRMなどのように、様々な種類のバックエンド・プロセスに対してサービスを要求するトランザクションを調整します。
TPMは、分散トランザクションを完了するために必要なコミットまたはロールバックを同期化します。TPMのTM部分が、分散コミットおよび分散ロールバックの発生するタイミングを制御します。このため、分散APでTPMを利用する場合、TPMのTM部分が2フェーズ・コミット・プロトコルを制御します。RMを使用して、TMはこのタスクを実行します。
TMは分散コミットまたはロールバックを制御するため、XAインタフェースを介してOracle Database(または他のRM)と直接通信する必要があります。TMは、トランザクション内のすべてのRMに関する情報をもとに、「XAライブラリ・サブルーチン」で説明するOracle XAライブラリ・サブルーチンを使用してOracle Databaseにトランザクションの処理方法を指示します。
Oracle XAライブラリ・インタフェースは、2フェーズ・コミット・プロトコルに従います。各イベントの順序は次のとおりです。
アプリケーション・プログラムは、トランザクションの境界を定義し、トランザクションを構成するアクションを指定します。たとえば、APはプリコンパイラでもOCIプログラムでもかまいません。APは、RMのネイティブ・インタフェース(たとえばSQL)を使用して、RMのリソースを操作します。
アプリケーション・プログラムは、TMを介し、TXと呼ばれるインタフェースを使用してすべてのトランザクション制御操作を開始および完了します。APがXAインタフェースを直接使用することはありません。APが中間層で分岐するブランチを認識することはありません。アプリケーション・スレッドがブランチの作業を明示的に結合、休止、一時停止および再開するかわりに、トランザクション処理モニターのTM部分がAPのためにグローバル・トランザクションのブランチを管理します。最終的に、APはTMをコールしてすべてをコミットするか、または何もコミットしません。
RMですべての分離セマンティクスについて単一エンティティとみなされるアプリケーション・スレッドは、密結合となります。密結合ブランチは、相互の変更を認識する必要があります。さらに、外部クライアントは、密結合セットの変更をすべて認識するか、まったく認識しない必要があります。アプリケーション・スレッドが密結合されていない場合は、疎結合となります。
Oracle Databaseは、動的登録と静的登録の両方をサポートします。動的登録の場合、RMは最初にアプリケーション・コールバックを実行します。静的登録の場合、関係のないRMがあっても、最初に、各RMに対してxa_start()をコールする必要があります。
Oracle Databaseは、リソース・マネージャとして、表15-1に示す情報を発行する必要があります。
| XA機能 | Oracle Databaseの詳細 |
|---|---|
|
|
Oracle Databaseの |
|
|
|
|
クローズ文字列 |
|
|
オープン文字列 |
|
|
ライブラリ |
Oracle XAを使用するアプリケーションをリンクするのに必要なライブラリには、プラットフォーム固有の名前が付けられています。TPM固有のライブラリをリンクする必要があることを除けば、通常のプリコンパイラまたはOCIプログラムをリンクする手順と同じです。
|
|
要件 |
ありません。XAをサポートする機能はStandard EditionおよびEnterprise Editionに含まれています。 |
Oracle XAライブラリ・サブルーチンを使用することで、TMはトランザクションの処理方法をOracle Databaseに指示できます。一般に、TMはxa_open()を使用してリソースをオープンする必要があります。通常、リソースはAPでtx_openをコールした結果としてオープンされます。一部のTMでは、アプリケーションが開始したときに、暗黙的にxa_open()をコールします。
同様に、アプリケーションがリソースの使用を完了したときに発生するクローズがあります(xa_close()を使用)。このクローズが発生するのは、APがtx_closeをコールしたとき、またはアプリケーションが終了したときです。
TMはRMに対して、次のように他の複数のタスクを実行するように指示します。
表15-2に、XAライブラリ・サブルーチンを示します。
一般に、APでは、xa_open()文字列で実行されるロールを理解する以外に、表15-2に示したサブルーチンについて考慮する必要はありません。
表15-3に示すように、Oracle DatabaseのXAインタフェースには、いくつかの関数が追加されています。
この項では、Oracle XAアプリケーションの開発およびインストールについて説明します。
DBAまたはシステム管理者の責任は次のとおりです。
DBA_PENDING_TRANSACTIONSビューが存在することを確認し、xa_open()文字列で指定したすべてのOracleユーザーに対して、このビューのSELECT権限を付与します。Oracle Databaseリリース7のクライアント・アプリケーションの場合は、Oracle XAライブラリで使用されるすべてのOracle Databaseアカウントに対して、V$XATRANS$ビューのSELECT権限を付与する必要があります。このビューは、XAライブラリのインストール時に作成されています。必要な場合は、Oracle DatabaseユーザーSYSとしてSQLスクリプトxaview.sqlを実行し、このビューを手動で作成できます。
DBAまたはシステム管理者は、Oracle Databaseに接続するプロセスをTPMシステムが開始することを認識する必要があります。TPMのマニュアルを参照して、このプロセスのためにどのような環境が存在するのか、ユーザーIDは何であるかを判断してください。この環境で$ORACLE_HOMEおよび$ORACLE_SIDに正しい値が設定されていることを確認してください。
アプリケーション開発者の責任は次のとおりです。
プリコンパイラ用のトランザクション指向のSQL文に関する特別な制限事項を守ってください。
オープン文字列は、トランザクション・モニターがデータベースをオープンするために使用します。オープン文字列内の最大文字数は256文字です。
この項の内容は次のとおりです。
例15-1に示す構文を使用してオープン文字列を定義できます。
ORACLE_XA{+required_fields...} [+optional_fields...]
次の文字列は、サンプル・パラメータ設定を示しています。
ORACLE_XA+DB=MANAGERS+SqlNet=SID1+ACC=P/scott/tiger +SesTM=10+LogDir=/usr/local/xalog ORACLE_XA+DB=PAYROLL+SqlNet=SID2+ACC=P/scott/tiger +SesTM=10+LogDir=/usr/local/xalog ORACLE_XA+SqlNet=SID3+ACC=P/scott/tiger +SesTM=10+LogDir=/usr/local/xalog
次の各項では、required_fieldsおよびoptional_fieldsプレースホルダに有効なパラメータについて説明します。
例15-1に示したrequired_fieldsプレースホルダは、表15-4に示す名前/値ペアのいずれかを指します。
| 構文要素 | 説明 |
|---|---|
|
|
ユーザーおよびパスワード情報が明示的には提供されないこと、およびオペレーティング・システム認証フォームが使用されることを示します。 詳細は、『Oracle Database管理者ガイド』を参照してください。 |
|
|
有効なOracle Databaseアカウントのユーザー名とパスワードを指定します。たとえば、 |
|
|
システムによりトランザクションが異常終了されるまでの、あるサービスから次のサービスまで、あるいはサービスからトランザクションのコミットまたはトランザクションまでの最大許容秒数を指定します。たとえば、
たとえば、TPMでクライアントとサーバー間にリモート・プロシージャ・コールが使用されている場合は、
値が |
例15-1に示したoptional_fieldsプレースホルダは、表15-5に示す名前/値ペアのいずれかを指します。
| 構文要素 | 説明 |
|---|---|
|
|
ローカル・トランザクションが許可されるかどうかを指定します。デフォルト値は |
|
|
Oracle Databaseプリコンパイラがデータベースの識別に使用する名前を示します。たとえば、
Oracle Databaseプリコンパイラのデフォルトのデータベースのみを使用する(SQL文で
一部のTPMベンダーは、同じオープン文字列を使用するサーバー・グループの名前を指定する方法を提供しています。グループ名とdb_nameの両方に対して同じ名前を選択する方が便利な場合があります。 |
|
|
Oracle XAライブラリのエラーとトレース情報が格納されるローカル・マシン上のパス名を示します。デフォルトは、 |
|
|
アプリケーションをオブジェクト・モードで初期化するかどうかを指定します。デフォルト値はfalseです。アプリケーションが、 |
|
|
データベースのオープン時に割り当てられるカーソルの数を指定します。これは、プリコンパイラ・オプション |
|
|
システムにログインするために使用するOracle Netデータベース・リンクを示します。この文字列は、
サーバー環境変数を制御できない場合は、 |
|
|
ロックが共有されるかどうかを示します。同じグローバル・トランザクション内の複数のOracle Databaseトランザクション・ブランチには、密結合または疎結合のどちらの方法も使用できます。ブランチが疎結合の場合は、ロックを共有できません。疎結合ブランチの場合は、値を |
|
|
|
|
|
アプリケーションがマルチスレッドかどうかを指定します。デフォルト値は |
この項では、プリコンパイラおよびOracle Call Interface(OCI)でOracle XAライブラリを使用する方法について説明します。この項の内容は次のとおりです。
カーソルは、Oracle XAアプリケーションで使用する場合はトランザクションの存続期間のみ有効です。明示的カーソルは、トランザクションが開始した後にオープンし、コミットまたはロールバックの前にクローズする必要があります。
プリコンパイラとのインタフェースでは、次の2つのオプションがあります。
次の例では、プリコンパイラPro*C/C++を使用しています。
デフォルトのデータベースでプリコンパイラにインタフェースするには、オープン文字列で使用されるDB=db_nameフィールドが存在しないことを確認してください。このフィールドが存在しない場合は、デフォルトの接続が指定されます。プロセスごとに1つのデフォルト接続のみが使用できます。
次に、デフォルトのPro*C/C++接続を識別するオープン文字列の例を示します。
ORACLE_XA+SqlNet=maildb+ACC=P/scott/tiger +SesTM=10+LogDir=/usr/local/logs
DB=db_nameが存在せず、空のデータベースID文字列を示していることに注意してください。
SQL文の構文は次のようになります。
EXEC SQL UPDATE Emp_tab SET Sal = Sal*1.5;
指定されたデータベースでプリコンパイラにインタフェースするには、オープン文字列にDB=db_nameフィールドを含めます。参照するすべてのデータベースは、対応するオープン文字列で指定した同一のdb_nameを参照する必要があります。
アプリケーションには、デフォルト・データベースの他に、名前を指定されたデータベースが1つ以上含まれることがあります。たとえば、あるデータベースで従業員の給与を更新し、別のデータベースでその従業員の部門番号(DEPTNO)を、第3のデータベースでその従業員の管理者を更新するとします。このような場合は、TMに次のようなオープン文字列を構成します。
ORACLE_XA+DB=MANAGERS+SqlNet=SID1+ACC=P/scott/tiger +SesTM=10+LogDir=/usr/local/xalog ORACLE_XA+DB=PAYROLL+SqlNet=SID2+ACC=P/scott/tiger +SesTM=10+LogDir=/usr/local/xalog ORACLE_XA+SqlNet=SID3+ACC=P/scott/tiger +SesTM=10+LogDir=/usr/local/xalog
例15-2の最後のオープン文字列にDB=db_nameフィールドがないことに注意してください。
アプリケーション・サーバー・プログラムでは、次のような宣言を入力します。
EXEC SQL DECLARE PAYROLL DATABASE; EXEC SQL DECLARE MANAGERS DATABASE;
ここでも、デフォルトの接続(DBフィールドを含まない3番目のオープン文字列に対応)には宣言は必要ありません。
更新を実行するときは、次に示すような文を入力します。
EXEC SQL AT PAYROLL UPDATE Emp_Tab SET Sal=4500 WHERE Empno=7788; EXEC SQL AT MANAGERS UPDATE Emp_Tab SET Mgr=7566 WHERE Empno=7788; EXEC SQL UPDATE Emp_Tab SET Deptno=30 WHERE Empno=7788;
最後の文は、デフォルトのデータベースを参照しているためAT句はありません。
Oracle Databaseプリコンパイラのリリース1.5.3以上では、次に示す例のように、AT句に文字ホスト変数を使用できます。
EXEC SQL BEGIN DECLARE SECTION; DB_NAME1 CHARACTER(10); DB_NAME2 CHARACTER(10); EXEC SQL END DECLARE SECTION; ... SET DB_NAME1 = 'PAYROLL' SET DB_NAME2 = 'MANAGERS' ... EXEC SQL AT :DB_NAME1 UPDATE... EXEC SQL AT :DB_NAME2 UPDATE...
Oracle XAライブラリを使用するOracle Call Interfaceアプリケーションでは、リソース・マネージャにログインするためにをOCISessionBegin()コールしないでください。ログインは、TPMを介して行うようにしてください。そのようなアプリケーションでは、関数xaoSvcCtx()を実行して、リソース・マネージャへのアクセスに必要なサービス・コンテキスト構造体を取得できます。
環境ハンドルをOCI関数に渡す必要があるアプリケーションでは、そのハンドルを検索するためにxaoEnv()もコールする必要があります。
アプリケーション・サーバーでは同時に複数のOracle DatabaseのRMをオープンできるため、適切なサービス・コンテキストを取得するためには適切な引数を使用して関数xaoSvcCtx()をコールする必要があります。
XAライブラリを使用する場合、トランザクションは、トランザクションをコミットまたはロールバックするSQL文によっては制御されません。制御は、トランザクションを開始および終了するTMに受け入れられるAPIによって行われます。表15-2に示したXAライブラリ・サブルーチンではなく、表15-6に示したTXインタフェースなど、TMにより提供されるAPIをコールします。
TMは、通常、XAインタフェースを介してトランザクションを制御します。このインタフェースには、表15-2「XAライブラリ・サブルーチン」に示す関数が含まれています。
| TX関数 | 説明 |
|---|---|
|
|
RMにログインします。 |
|
|
RMからログアウトします。 |
|
|
新規トランザクションを開始します。 |
|
|
トランザクションをコミットします。 |
|
|
トランザクションをロールバックします。 |
ほとんどのTPMアプリケーションは、アプリケーション・クライアントがサービスを要求し、アプリケーション・サーバーがサービスを提供するというクライアント/サーバー・アーキテクチャを使用しています。「プリコンパイラ・アプリケーションの例」に示す例では、そのようなクライアント/サーバー・モデルを使用しています。サービスとは論理作業単位であり、Oracle DatabaseがRMである場合は、関連する作業単位を実行する一連のSQL文で構成されます。
たとえば、「貸方記入」というサービスが口座番号および貸方記入額を受け取ると、このサービスは、データベース内の特定の表にある情報を更新するSQL文を実行します。さらに、サービスはその他のサービスを要求することもあります。たとえば、「振替」サービスの場合は、「貸方記入」および「借方記入」にサービスを要求します。
通常、アプリケーション・クライアントは、トランザクション内で作業を実行するためにアプリケーション・サーバーにサービスを要求します。ただし、一部のTPMシステムでは、アプリケーション・クライアント自身がローカルにサービスを提供できます。「プリコンパイラ・アプリケーションの例」に示すとおり、トランザクション制御文は、クライアントまたはサーバーのどちらの側でも記述できます。
複数のプロセスを同一のトランザクションに参加させるために、TPMは参加プロセス間でトランザクション情報が伝達できる通信APIを提供しています。通信APIの例として、RPC、疑似RPC関数、送信/受信関数があります。
主要ベンダーが異なる通信関数をサポートしているため、次の例では、通信APIを汎用化するために通信疑似関数tpm_serviceを使用しています。
X/Openの準備段階の仕様には、通信関数を提供する代替方法がいくつか取り入れられています。主要TPMベンダーでは、これらの代替方法を1つ以上はサポートしています。
次の例は、プリコンパイラ・アプリケーションを示しています。アプリケーション・サーバーがTPM固有の方法でRMシステムにすでにログインしているとします。例15-3に、アプリケーション・サーバーによって開始されるトランザクションを示します。
/***** Client: *****/ tpm_service("ServiceName"); /*Request Service*/ /***** Server: *****/ ServiceName() { <get service specific data> tx_begin(); /* Begin transaction boundary */ EXEC SQL UPDATE ....; /* This application server temporarily becomes */ /* a client and requests another service. */ tpm_service("AnotherService"); tx_commit(); /* Commit the transaction */ <return service status back to the client> }
例15-4に、アプリケーション・クライアントによって開始されるトランザクションを示します。
/***** Client: *****/ tx_begin(); /* Begin transaction boundary */ tpm_service("Service1"); tpm_service("Service2"); tx_commit(); /* Commit the transaction */ /***** Server: *****/ Service1() { <get service specific data> EXEC SQL UPDATE ....; <return service status back to the client> } Service2() { <get service specific data> EXEC SQL UPDATE ....; ... <return service status back to client> }
既存のプリコンパイラまたはOCIアプリケーションを、Oracle XAライブラリを使用するTPMアプリケーションに移行するには、次の手順に従います。
tx_open関数およびtx_close関数を使用するように要求するTPMと、ログインおよびログオフを暗黙的に実行するTPMがあります。オープン文字列にSqlNetパラメータを指定しないと、アプリケーションはデフォルトのOracle Netドライバを使用します。このため、ORACLE_HOMEおよびORACLE_SID環境変数を正しく定義して、アプリケーション・サーバーを立ち上げる必要があります。これは、TPMに固有の方法で行われます。これを行う方法の詳細は、TPMベンダーのマニュアルを参照してください。
EXEC SQL CONNECT(プリコンパイラの場合)またはOCISessionBegin()、OCIServerAttach()およびOCIEnvCreate()(OCIの場合)をtx_open()で置き換えます。 切断文EXEC SQL COMMIT/ROLLBACK WORK RELEASE (プリコンパイラの場合)またはOCISessionEnd()/OCIServerDetach(OCIの場合)をtx_close()で置き換えます。
たとえば、tx_commit()/tx_rollback()によってCOMMIT/ROLLBACK文EXEC SQL COMMIT/ROLLBACK WORK(プリコンパイラの場合)またはOCITransCommit()/OCITransRollback()(OCIの場合)を置き換え、tx_begin()をコールすることによってトランザクションを開始します。
release_cursor=noを使用します。release_cursor=yesは、文が1回しか実行されないことが確実なときにのみ使用します。
表15-7に、プリコンパイラまたはOCIアプリケーションをTPMアプリケーションに移行するときに、正規のOracle Databaseコマンドを置き換えるTPM関数を示します。
| 正規のOracle Databaseコマンド | TPM関数 |
|---|---|
|
|
|
|
トランザクションの暗黙的な開始 |
|
|
|
SQLを実行するサービス |
|
|
|
|
|
|
|
切断 |
|
スレッドをサポートするトランザクション・モニターを使用する場合は、Oracle XAライブラリを使用してスレッド・セーフなアプリケーションを作成できます。ただし、注意が必要な問題がいくつかあります。
制御のスレッド(またはスレッド)とは、RMへの一連の接続のことです。スレッド化されていないシステムでは、各プロセスを制御のスレッドとみなすことができます。これは、各プロセスにはRMへの接続がそれぞれ独自にあり、それぞれが独立したRM表をメンテナンスしているためです。スレッド化されているシステムでは、各スレッドにはRMとの自律型接続があり、プライベートなRM表をメンテナンスします。このプライベートな表は新しいスレッドのそれぞれに対して割り当てる必要があり、またスレッドが終了したときは(異常終了であっても)割当てを解除する必要があります。
xa_open()文字列では、Threads=句が指定されます。TMでスレッドを使用できるようにするには、この句をtrueに指定する必要があります。デフォルトはfalseです。ほとんどの場合、スレッドはTMによって作成され、アプリケーションは新しいスレッドがいつ作成されたのか認識しません。このため、サービス・コンテキストは、TMアプリケーション用に作成される各サービス内のスタック上に割り当てることをお薦めします。そのサービス内でOracle Database関連のコールを実行する前に、xaoSvcCtx関数をコールして初期化済のOCIサービス・コンテキストを取得する必要があります。このコンテキストをサービス内でOCIコールに使用できます。
スレッドを使用するときは、次の制限事項が適用されます。
EXEC SQL ALLOCATEおよびEXEC SQL USEはサポートされません。このため、スレッド化が使用可能であるときは、埋込みSQL文を非XA接続にまたがって使用することはできません。
EXEC SQL CONNECTを介して接続し、他のスレッドでxa_open()を介して接続することはできません。
この項では、問題またはシステム障害の発生時に情報を検索する方法を説明します。また、トレース・ファイルおよびペンディング・トランザクションのリカバリについても説明します。 この項の内容は次のとおりです。
Oracle XAライブラリでは、すべてのエラーおよびトレース情報がトレース・ファイルに記録されます。この情報は、XAエラー・コードを補足するときに役立ちます。たとえばxa_open()障害が発生したとき、その原因として、オープン文字列が正しくなかったか、Oracle Databaseインスタンスの検索が正常に実行されなかったか、またはログイン認可が正常に実行されなかったかを示します。
トレース・ファイル名はxa_db_namedate.trcです。db_nameはオープン文字列のフィールドDB=db_nameで指定したデータベース名で、dateは情報がトレース・ファイルに記録された日付です。オープン文字列でDB=db_nameを指定しない場合、自動的にデフォルトでNULLという名前になります。
たとえば、xa_NULL06022005.trcは、2005年6月2日に作成されたトレース・ファイルを示しています。RMがオープンされたときに、DBフィールドがオープン文字列に指定されていませんでした。ファイル名xa_Finance12152004.trcは、2004年12月15日に作成されたトレース・ファイルを示しています。RMがオープンされたときに、DBフィールドはオープン文字列で「Finance」と指定されていました。
トレース・ファイルに次の内容が含まれているとします。
1032.12345.2: ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。 1032.12345.2: xaolgn: XAER_INVAL; logon denied
表15-8に、各要素の意味を示します。
| 文字列 | 説明 |
|---|---|
|
|
情報が記録された時刻 |
|
|
プロセスID(PID) |
|
|
リソース・マネージャID |
|
|
モジュール名 |
|
|
XA標準での指定に従って戻されたエラー |
|
|
戻されたOracle Database情報 |
通常、XAトレース・ファイルはエラーが検出された場合にのみオープンされます。xa_open()文字列DbgFlは、XAライブラリに関する詳細を記録するトレース機能を提供します。デフォルト値は0(ゼロ)です。次の組合せのいずれかに設定できます。
0x1: XAインタフェース内の各プロシージャの入口および出口をトレースできます。この値は、TPモニターがどのXAコールを作成し、どのトランザクション識別子を生成しているかを正確に調べるときに役立ちます。
0x2: 他の非公開XAライブラリ・ルーチンへの入口および出口をトレースできます。通常、これはOracle Database開発者用の機能です。
0x4: OCIに対する専用コールのように、XAライブラリが作成する他の様々な関心のあるコールをトレースできます。通常、これはOracle Database開発者用の機能です。XAアプリケーションでは、トレース・ファイルの位置が次のアルゴリズムに従って判別されます。
LogDirディレクトリ。
LogDir を指定しないと、Oracle XAアプリケーションは(Oracleホームがアクセス可能な場合は)次のディレクトリにトレース・ファイルを作成しようとします。
インダウト・トランザクションまたはペンディング・トランザクションとは、準備はできているがデータベースに対してコミットされていないトランザクションです。一般的に、TPMシステムが提供するTMは、インダウト・トランザクションまたはペンディング・トランザクションの障害を解決し、リカバリします。次の状況では、DBAがインダウト・トランザクションをオーバーライドする必要がある場合があります。
前述のような状況でインダウト・トランザクションをオーバーライドする方法の詳細、およびインダウト・トランザクションをコミットまたはロールバックするかどうかを決定する方法の詳細は、TPMのマニュアルを参照してください。
Oracle DatabaseのSYSアカウントには次のビューがあり、正規のOracle DatabaseアプリケーションおよびOracle XAアプリケーションによって生成されたトランザクションが含まれています。
Oracle XAアプリケーションによって生成されたトランザクションの場合は、次に示す列情報がDBA_2PC_NEIGHBORS表に適用されます。
db_nameは、オープン文字列で常にDB=db_nameと指定されることに注意してください。オープン文字列にこのフィールドを指定しないと、この列の値はOracle XAアプリケーションが生成するトランザクションについてはNULLxa.oracle.comになります。
たとえば、次のSQL文を使用すると、Oracle XAアプリケーションによって生成されたインダウト・トランザクションの詳細情報を取得できます。
SELECT * FROM DBA_2PC_PENDING p, DBA_2PC_NEIGHBORS n WHERE p.LOCAL_TRAN_ID = n.LOCAL_TRAN_ID AND n.DBID = 'xa_orcl';
別の方法として、TPMが使用するフォーマットIDがわかっている場合は、DBA_PENDING_TRANSACTIONSまたはV$GLOBAL_TRANSACTIONSを使用できます。DBA_PENDING_TRANSACTIONSでは準備済トランザクションの両方のリストが提供されますが、V$GLOBAL_TRANSACTIONSでは、すべてのアクティブなグローバル・トランザクションのリストが提供されます。
この項の内容は次のとおりです。
Oracle XAアプリケーションは、次の制限事項に違反しないかぎり、データベース・リンク経由で他のOracle Databaseインスタンスにアクセスできます。
トランザクション処理モニター(TPM)は、共有サーバーを使用してOracle Database Aへの接続をオープンします。データベース・リンクに必要なオペレーティング・システム・ネットワーク接続は、専用サーバー・プロセスではなくディスパッチャによってオープンされます。このため、様々なサービスやスレッドでトランザクションを操作できます。
この制限事項が満たされていない場合、XAトランザクション内でデータベース・リンクを使用すると、専用サーバー・プロセスと他方のOracle Database Bの間にオペレーティング・システム・ネットワーク接続が作成されます。このネットワーク接続は専用サーバー・プロセス間で移動できないため、データベースAのこの専用サーバー・プロセスから連結解除することはできません。データベース・リンクを介してデータベースBにアクセスするときに、ORA-24777エラーが戻されます。
この制限事項が満たされている場合、Oracle Databaseはデータベース・リンクを許可し、トランザクション・プロトコルを他のOracle Databaseインスタンスに伝播(準備、ロールバックおよびコミット)します。
共有サーバー構成を使用できない場合は、リモート・データベースにEXEC SQL AT構文を使用してPro*C/C++アプリケーション経由でアクセスします。
init.oraパラメータOPEN_LINKS_PER_INSTANCEは、移行可能なオープン・データベース・リンク接続の数を指定します。これらのdblink接続は、トランザクションのコミット後に接続をキャッシュできるように、XAトランザクションによって使用されます。接続を作成したユーザーがトランザクションを作成したユーザーと同じである場合は、別のトランザクションが自由にデータベース・リンク接続を使用できます。このパラメータは、1つのセッションにおけるリモート・データベースへの同時オープン接続の最大数(データベース・リンクを含む)を指定するinit.oraパラメータOPEN_LINKSとは異なります。OPEN_LINKSパラメータは、XAアプリケーションには適用できません。
同じグローバル・トランザクション内の複数のOracle Databaseトランザクション・ブランチには、密結合または疎結合のどちらの方法も使用できます。トランザクション・ブランチが密結合の場合は、ロックを共有できます。そのため、あるトランザクション・ブランチでのCOMMIT前更新は、同じグローバル・トランザクションに属する他のブランチで参照可能です。疎結合トランザクション・ブランチの場合、ブランチはロックを共有せず、他のブランチでの更新を認識しません。
密結合ブランチの場合、Oracle Databaseは文を実行する前にDXロックを取得します。システムが文の実行前にロックを取得しないため、疎結合トランザクション・ブランチの同時実行性が増します。デメリットは、すべてのトランザクション・ブランチが2フェーズ・コミットを実行する必要があることです。XAの1フェーズ最適化は使用できません。
表15-9に、密結合ブランチと疎結合ブランチのトレードオフを示します。
| 属性 | 密結合ブランチ | 疎結合ブランチ |
|---|---|---|
|
2フェーズ・コミット |
[全ブランチについて準備、最後のブランチについてコミット] |
[全ブランチについて準備およびコミット] |
|
シリアライズ |
データベース・コール |
なし |
この項の内容は次のとおりです。
Oracle Databaseでは、様々なインスタンスがRACの異なるトランザクション・ブランチで操作できます。たとえば、ノード1がブランチAで操作し、ノード2がブランチBで操作できます。トランザクション・ブランチが異なるインスタンスにある場合は疎結合であり、ロックを共有しません。この場合、Oracle Databaseでは、様々なアプリケーション・スレッドの異なる作業単位が、リソースを共有しない個別エンティティとして処理されます。
また、複数のインスタンスが1つのトランザクション・ブランチで操作する場合もあります。たとえば、次のように1つのトランザクションがノード1およびノード2にあるとします。
前述の順序では、ノード2は物理的に異なるノード(ノード1)にあるブランチを再開しないため、Oracle Databaseではエラーが戻されます。
RACで密結合を実現するには、DTPサービスを使用します。DTPサービスのカーディナリティ(1)により、ロード・バランシングが有効化されているかどうかに関係なく、すべての密結合ブランチが確実に同じインスタンスに置かれます。中間層コンポーネントは、常に1つのRACインスタンスにマップする共通の論理データベース・サービス名を使用して、Oracle Databaseをアドレス指定します。データベース・インスタンスの物理特性は、データベース・サービスの中間名リゾルバによって隠されます。DTPサービスを使用すると、密結合グローバル・トランザクションの参加者はすべて1つのインスタンス上でブランチを作成できます。
たとえば、DTPサービスを使用すると、次の一連のアクションが同じインスタンス上で発生します。
xa_start()
xa_end() (SUSPEND)
xa_start() (RESUME)
xa_prepare()
xa_commit()またはxa_rollback()
さらに、それぞれが同じDTPサービスでOracle RMをアドレス指定する場合は、複数の密結合ブランチが同じインスタンスにあります。
クラスタのインスタンスをすべて活用するには、分散トランザクションを管理する各ノードに1つ以上、複数のDTPサービスを作成します。グローバル分散トランザクションのブランチは、すべて同じインスタンスに存在します。そのため、RACクラスタのすべてのインスタンスおよびノードを利用して多数の分散XAトランザクションのロード・バランシングを実行し、アプリケーションのスループットを最大化できます。
Oracle Database 10gリリース2(10.2)までは、RACでの障害検出とフェイルオーバーおよびフェイルバックのトリガーはTMで実行されていました。インダウト・トランザクションに関する情報をDBA_2PC_PENDINGに確実に伝播させるために、TMではインダウト・トランザクションの解決に進む前にxa_recover()を起動する必要がありました。インスタンスに障害が発生した場合、XAクライアント・ライブラリはSYS.DBMS_SYSTEM.DIST_TXN_SYNCプロシージャを実行して障害を起こしたインスタンスのUNDOセグメントがリカバリされたことを確認するまで、他のインスタンスにフェイルオーバーできませんでした。現行のリリースでは、処理中のトランザクションに関する十分な情報がTMにあれば、このようにxa_recover()を起動するという要件はありません。
RACでDTPサービスを使用すると、次のようなメリットがあります。
TMは、トランザクションID(XID)のグローバル一意性を保持する必要があります。XA仕様に従い、RMではTMからXIDを受け入れる必要があります。RACのXAでは指定されたXIDがクラスタ内で一意であるかどうかは判断できません。
たとえば、RACインスタンス1にXID Fmt(x).Tx(1).Br(1)、RACインスタンス2に別のXID Fmt(x).Tx(1).Br(1)があるとします。XIDがRACインスタンス間で一意ではありませんが、どちらもブランチを開始してSQLを実行できます。
この項では、次のSQL操作に関する制限事項について説明します。
グローバル・トランザクションの進行状況の調整および監視はTMに責任があるため、グローバル・トランザクションのロールバックまたはコミットを独立して行うOracle Database固有の文をアプリケーションに入れないでください。ただし、ローカル・トランザクションではロールバックおよびコミットを使用できます。
グローバル・トランザクションの途中で、プリコンパイラ・アプリケーションにEXEC SQL ROLLBACK WORKを使用しないでください。同様に、OCIアプリケーションではOCITransRollback()またはバージョン7で同等のorol()を実行しないでください。グローバル・トランザクションをロールバックするには、tx_rollback()をコールします。
同様に、グローバル・トランザクションの途中で、プリコンパイラ・アプリケーションにEXEC SQL COMMIT WORK文を使用しないでください。OCIアプリケーションでは、OCITransCommit()またはバージョン7で同等のocom()を実行しないでください。たとえば、tx_commit()またはtx_rollback()を使用して、グローバル・トランザクションを終了してください。
CREATE TABLEなどのSQL DDL文は、暗黙的なコミットを意味するためOracle XAアプリケーションでは実行できません。
Oracle Databaseでは、セッション状態が複数のTPMサービス間で有効であることを保証しません。たとえば、あるTPMサービスがセッション変数(グローバル・パッケージ変数など)を更新した場合、同じグローバル・トランザクションの一部として実行している別のTPMサービスにはこの変更が認識されないことがあります。セーブポイントは1つのTPMサービス内で使用してください。アプリケーションが、別のTPMサービスで作成されたセーブポイントを参照しないようにしてください。同様に、アプリケーションが、別のTPMサービスで実行されたカーソルからフェッチしないようにしてください。
接続および切断にEXEC SQLコマンドを使用しないでください。つまり、EXEC SQL CONNECT、EXEC SQL COMMIT WORK RELEASEまたはEXEC SQL ROLLBACK WORK RELEASEを使用しないでください。
次の制限事項に注意してください。
TRANSACTIONS初期化パラメータを、グローバル・トランザクションの同時実行予測数に設定します。初期化パラメータOPEN_LINKS_PER_INSTANCEは、移行可能なオープン・データベース・リンク接続の数を指定します。これらのデータベース・リンク接続は、トランザクションのコミット後に接続をキャッシュできるように、XAトランザクションによって使用されます。xa_open()コールの最大数は32です。
ax_regおよびax_unreg記号を定義する)をOracle Databaseクライアント共有ライブラリの前に指定する必要があります。プラットフォームで共有ライブラリがサポートされていない場合、またはリンカーがリンク・ライン内のライブラリの順序を区別しない場合は、Oracle Databaseの非共有クライアント・ライブラリを使用します。これらのリンク制限は、XAの動的登録(Oracle XAスイッチxaoswd)を使用する場合のみ適用できます。
|
![]() Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|