1 つまたは複数のデータ・ソースへの接続に記載されているトランザクションのシナリオは、 1 つのトランザクションでただ 1 つのデータベース・サーバーと対話するアプリケーションを例として取り上げています。並行トランザクションには並行接続を用いることができますが、異なるトランザクションどうしが調整されることはありません。
複数サイト更新のことを、分散作業単位 (DUOW)、2 フェーズ・コミット (2PC)、整合分散トランザクションともいいます。これを用いると、アプリケーションが複数のリモート・データベース・サーバー中のデータを更新しても、整合性が保証されます。
複数サイト更新の好例として、一般的な銀行用トランザクションがあります。ある口座から、データベース・サーバーの異なる別の口座にお金を移動する場合を考えてみましょう。このトランザクションの場合、一方の口座に対する借方記入操作という更新がコミットされるのは、他方の口座に対する貸方記入処理という更新もコミットされている場合に限られていることが重要です。複数サイト更新に関する考慮事項は、両方の口座を表すデータが 2 つの別々のデータベース・サーバーによって管理されている場合に適用されます。
複数サイト更新によっては、トランザクション・マネージャーを使用して、複数のデータベース間で 2 フェーズ・コミットを調整することが含まれます。複数サイト更新の詳細説明については、管理の手引き を参照してください。このセクションでは、さまざまなトランザクション・マネージャーを使用するために DB2 CLI アプリケーションを作成する方法について説明します。
DB2 CLI/ODBC アプリケーションで DB2 自体をトランザクション・マネージャー (DB2 TM) として使用し、すべての IBM データベース・サーバーに対して分散トランザクションの調整を行えます。 DB2 をトランザクション・マネージャーとして使用する場合の要件と機能に関する詳細は、 管理の手引き を参照してください。
DB2 トランザクション・マネージャーをセットアップするには、 管理の手引き の情報に従わなければなりません。
CLI/ODBC アプリケーション中で DB2 をトランザクション・マネージャーとして使用するには、 CLI/ODBC 構成キーワードを次のように設定しなければなりません。
[COMMON] DISABLEMULTITHREAD = 1 CONNECTTYPE=2 SYNCPOINT=2
CLI/ODBC 構成キーワードの設定について詳しくは、CLI/ODBC アクセスのためのプラットフォーム固有の詳細情報を参照してください。
上記の構成キーワードのうち 2 つは、次の環境属性を使用して設定することもできます。
詳細については、SQLSetEnvAttr() を参照してください。 DISABLEMULTITHREAD キーワードには該当する環境属性はないので、今までどおり db2cli.ini ファイル内の [COMMON] セクション中で 1 に設定しなければなりません。
DISABLEMULTITHREAD キーワードが db2cli.ini ファイルの [COMMON] セクションになければならないということは、当該クライアント・インスタンスからすべてのデータ・ソースへのすべての接続に影響が及ぶことを意味します。したがって、 DB2 クライアント・インスタンスはプロセス・ベースの CLI アプリケーションかスレッド・ベースの CLI アプリケーションのうちどちらか一方だけをサポートできますが、両方ともサポートすることはできません。
DB2 CLI/ODBC 構成キーワード DISABLEMULTITHREAD は 1 に設定しなければなりません。したがって DB2 CLI/ODBC ドライバーでは、アプリケーション・プロセスで行われたすべての接続について 1 つの DB2 コンテキストが使用されることになります。データベース要求はすべてプロセス・レベルで直列化されます。
環境属性 SQL_ATTR_CONNECTTYPE は、アプリケーションを整合分散環境で実行するか、または非整合分散環境で実行するかを制御します。この属性に指定可能な 2 つの値は、以下のとおりです。
アプリケーション内のすべての接続の SQL_ATTR_CONNECTTYPE 設定は、同じでなければなりません。この環境属性はアプリケーションが設定することをお勧めします。必要であれば、環境ハンドルが SQLAllocHandle() への呼び出しにより (SQL_HANDLE_ENV の HandleType を指定して) 作成された直後に設定してください。 ODBC アプリケーションは SQLSetEnvAttr() にアクセスできないため、接続を確立する前に SQLSetConnectAttr() を使用してこの設定を行うことになります。
整合トランザクションは、複数のデータベース接続の間でコミットやロールバックが調整 (整合) されることを意味します。 SQL_ATTR_CONNECTTYPE 属性の SQL_COORDINATED_TRANS 設定は、 IBM の組み込み SQL にあるタイプ 2 CONNECT に対応するもので、 SQL_ATTR_SYNC_POINT 属性と関連づけて考える必要があります。この属性には、次の 2 つの設定が考えられます。
SQL_ATTR_CONNECTTYPE の場合と同じように、この環境属性はアプリケーションが設定することをお勧めします。必要であれば、環境ハンドルが SQLAllocHandle() への呼び出しにより (SQL_HANDLE_ENV の HandleType を指定して) 作成された直後に設定してください。 ODBC アプリケーションでは、SQLSetConnectAttr() を使用して、接続を確立する前にこの環境のもとで接続ハンドルごとに設定しなければなりません。
アプリケーション内のすべての接続の SQL_ATTR_CONNECTTYPE および SQL_ATTR_SYNC_POINT 設定は同じでなければなりません。最初の接続が確立された後は、それ以降のすべての接続タイプは最初のものと同じでなければなりません。整合接続は、手動コミット・モードに省略時設定されています。(自動コミット・モードについては、 コミットまたはロールバックを参照してください。)
DB2 をトランザクション・マネージャーとして実行している際には、複数サイト更新環境で関数 SQLEndTran() を使用しなければなりません。
図 5 は、 2 つの SQL_CONCURRENT_TRANS 接続 ('A' と 'B') でステートメントを実行時のアプリケーションの論理フローを表すとともに、トランザクションの有効範囲を示しています。
図 6 は、同一ステートメントが 2 つの SQL_COORDINATED_TRANS 接続 ('A' および 'B') で実行されているのを表しており、整合分散トランザクションの有効範囲を示しています。
![]() |
![]() |
アプリケーションが整合トランザクション接続を確立するには、 SQLSetEnvAttr() 関数を呼び出すか、または CONNECTTYPE キーワードおよび SYNCPOINT キーワードを DB2 CLI 初期設定ファイルまたは SQLDriverConnect() の接続ストリングに設定します。初期設定ファイルは、SQLSetConnectAttr() 関数を使用しない既存のアプリケーションのためのものです。キーワードの詳細については、DB2 CLI/ODBC 構成キーワードのリストを参照してください。
アプリケーションでは、並行接続と整合接続を混合して使うことはできません。最初の接続のタイプが決まると、それ以降のすべての接続のタイプはそれに従います。 SQLSetEnvAttr() は、接続活動中に接続タイプを変更しようとすると、エラーが返されます。
制限
複数サイト更新環境で組み込み SQL と CLI/ODBC 呼び出しを混合することはサポートされていますが、混合アプリケーションを作成する際の制約事項がすべて適用されます。詳細については、組み込み SQL と DB2 CLI の混合を参照してください。
次の例では、SQL_COORDINATED_TRANS に設定される SQL_ATTR_CONNECTTYPE、および SQL_ONEPHASE に設定される SQL_ATTR_SYNC_POINT を使用して 2 つのデータ・ソースへの接続を示しています。
/* ... */ /* main */ int main( int argc, char * argv[] ) { SQLHANDLE henv, hdbc[MAX_CONNECTIONS] ; SQLRETURN rc ; /* ... */ /* allocate an environment handle */ SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv ) ; /* Before allocating any connection handles, set Environment wide Connect Options Set to Connect Type 2, Syncpoint 1 */ if ( SQLSetEnvAttr( henv, SQL_CONNECTTYPE, ( SQLPOINTER ) SQL_COORDINATED_TRANS, 0 ) != SQL_SUCCESS ) { printf( ">---ERROR while setting Connect Type 2 -------------\n" ) ; return( SQL_ERROR ) ; } /* ... */ if ( SQLSetEnvAttr( henv, SQL_SYNC_POINT, ( SQLPOINTER ) SQL_ONEPHASE, 0 ) != SQL_SUCCESS ) { printf( ">---ERROR while setting Syncpoint One Phase -------------\n" ) ; return( SQL_ERROR ) ; } /* ... */ /* Connect to first data source */ prompted_connect( henv, &hdbc[0] ) ; /* Connect to second data source */ DBconnect( henv, &hdbc[1] ) ; /********* Start Processing Step *************************/ /* allocate statement handle, execute statement, etc. */ /********* End Processing Step ***************************/ /* Disconnect, free handles and exit */
Windows NT、Windows 95、および Windows 98 オペレーティング・システムの Microsoft Transaction Server (MTS) のもとで稼働しているアプリケーションでは、 MTS を使用して複数の DB2 UDB、ホスト、および AS/400 データベース・サーバーや MTS に準拠した他のリソース・マネージャーとの 2 フェーズ・コミットを調整できます。
Microsoft Transaction Server (MTS) をサポートするための新しい接続属性が、 SQLSetConnectAttr() 中に作成されています。 SQL_ATTR_ENLIST_IN_DTC に関する情報は、SQLSetConnectAttr - 接続属性を設定するを参照してください。
MTS のソフトウェア前提条件
MTS をサポートするにはバージョン 5.2 以上の DB2 クライアントが必要です。また、MTS は Hotfix 0772 のバージョン 2.0 以降でなければなりません。
DB2 UDB V5.2 以降を Microsoft Transaction Server (MTS) バージョン 2.0 と完全に統合することができます。 Windows 32 ビット オペレーティング・システムの MTS のもとで稼働しているアプリケーションでは、 MTS を使用して複数の DB2 UDB、ホスト、および AS/400 データベース・サーバーや MTS に準拠した他のリソース・マネージャーとの 2 フェーズ・コミットを調整できます。
Microsoft Transaction Server サポートは自動的に使用可能になります。 tp_mon_name データベース・マネージャー構成パラメーターを MTS に設定することもできますが、これは必要ないので無視されます。
注: | DB2 MTS サポートのインストールと構成に役立つ追加の技術情報が、 IBM Web サイトにあります。 URL を http://www.ibm.com/software/data/db2/library/ に設定し、 DB2 ユニバーサル・データベースの "Technote" をキーワード "MTS" で検索してください。 |
MTS をサポートするには DB2 クライアント・アプリケーション・イネーブラー (CAE) バージョン 5.2 以降が必要です。また、MTS のバージョンは Hotfix 0772 のバージョン 2.0 以降でなければなりません。
DB2 ODBC ドライバーを Windows 32 ビット オペレーティング・システムにインストールすると、新しいキーワードがレジストリーに自動的に追加されます。
HKEY_LOCAL_MACHINE\software\ODBC\odbcinit.ini\IBM DB2 ODBC Driver: Keyword Value Name: CPTimeout Data Type: REG_SZ Value: 60
MTS のインストールと構成に関する考慮事項を次に要約します。 DB2 の MTS サポートを使用するには、以下の手順に従わなければなりません。
DB2 CLI/ODBC アプリケーションを実行するときは、次の構成キーワード (db2cli.ini ファイルに設定されている) を省略時値から変更しないでください。
MTS サポートを使用できるようにするために作成された DB2 CLI アプリケーションが、上記のキーワードに対応している属性値を変更することのないようにしてください。また、アプリケーションが次の属性の省略時値を変更しないようにしてください。
注: | DB2 MTS サポートのインストールと構成に役立つ追加の技術情報が、 IBM Web サイトにあります。 URL を http://www.ibm.com/software/data/db2/library/ に設定し、 DB2 ユニバーサル・データベースの "Technote" をキーワード "MTS" で検索してください。 |
MTS 調整トランザクションを使用した複数サイト更新用に、次のサーバーがサポートされています。
MTS Explorer というツールでトランザクション・タイムアウト値を設定できます。詳細については、オンラインの MTS Administrator Guide を参照してください。
トランザクションがトランザクション・タイムアウト値 (省略時値は 60 秒) より長くかかる場合は、 MTS は関係しているすべてのリソース・マネージャーの打ち切りを非同期的に発行し、トランザクション全体が打ち切られます。
DB2 サーバーに対する接続の場合、打ち切りは DB2 ロールバック要求に変換されます。接続に関するロールバック要求は、他のデータベース要求と同様に直列化されるので、データベース・サーバー上のデータの保全性が保証されます。
次のような結果になります。
接続のプール処理を行うと、アプリケーションが接続のプールから接続を使用できるようになり、接続を使用するたびに再確立する必要がなくなります。接続を作成してプールに入れると、アプリケーションは接続プロセスを全部実行する代わりに、その接続を再利用できます。接続がプールされるのは、アプリケーションが ODBC データ・ソースから切断され、同じ属性の接続が新しく行われた場合です。
接続のプール処理は ODBC ドライバー・マネージャー 2.x の機能です。 MTS には最新版の ODBC ドライバー・マネージャー (バージョン 3.5) が付属していますが、このバージョンでは接続のプール処理の構成に多少の変更が加えられており、またトランザクションの MTS COM オブジェクト間の ODBC 接続に関する新機能があります (同一トランザクションに加わっている COM オブジェクト間の ODBC 接続の再利用を参照)。
ODBC ドライバー・マネージャー 3.5 で接続のプール処理を起動するには、 ODBC ドライバーが新しいキーワードをレジストリーに登録する必要があります。該当するキーワードは次のとおりです。
Key Name: SOFTWARE\ODBC\ODBCINST.INI\IBM DB2 ODBC DRIVER Name: CPTimeout Type: REG_SZ Data: 60
32 ビット Windows オペレーティング・システム用の DB2 ODBC ドライバーのバージョン 6 以降は、接続のプール処理を完全にサポートしているので、このキーワードは登録済みです。バージョン 5.2 のクライアントの場合は修正パッケージ 3 (WR09024) 以降をインストールしなければなりません。
省略時値の 60 は、接続が 60 秒間プールされた後に切断されることを示しています。
業務の多い環境では、CPTimeout 値の数値を大きくして (Microsoft 社では特定の環境の場合に 10 分に設定するよう勧めることがある) 物理的な接続と切断の回数を抑えた方が賢明です。その理由は、この種の処理はシステム・メモリーや通信スタック資源を含む多大なシステム資源を使用するからです。
加えて、複数プロセッサー・マシンにおける同じトランザクション内のオブジェクト間で、同じ接続が確実に使用されるようにするために、「1 プロセッサーに対して複数のプール」のサポートをオフにする必要があります。そのためには、以下のレジストリー設定値を odbcpool.reg というファイルにコピーし、平文テキスト・ファイルとして保管し、 odbcpool.reg コマンドを発行します。 Windows オペレーティング・システムは以下のレジストリー設定値をインポートします。
REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Connection Pooling] "NumberOfPools"="1"
このキーワードを 1 に設定しないと、MTS は異なるプールに接続をプールすることがあり、したがって同じ接続を再利用しないことになります。
MTS COM オブジェクトが ADO を使ってデータベースにアクセスする場合、 OLEDB リソース・プールをオフにする必要があります。そうすれば、 ODBC 用の Microsoft OLEDB プロバイダー (MSDASQL) が ODBC 接続プールを妨害することはありません。この機能は ADO 2.0 では OFF に初期設定されますが、 ADO 2.1 では ON に初期設定されます。 OLEDB リソース・ポーリングをオフにするには、以下の行を oledb.reg というファイルにコピーし、平文テキスト・ファイルとして保管し、 oledb.reg コマンドを発行します。 Windows オペレーティング・システムは以下のレジストリー設定値をインポートします。
REGEDIT4 [HKEY_CLASSES_ROOT\CLSID\{c8b522cb-5cf3-11ce-ade5-00aa0044773d}] @="MSDASQL" "OLEDB_SERVICES"=dword:fffffffc
MTS COM オブジェクト間の ODBC 接続では、接続のプール処理が (COM オブジェクトがトランザクションかどうかに関係なく) 自動的にオンになります。
複数の MTS COM オブジェクトが同一トランザクションに加わっている場合、次の方法で接続を複数の COM オブジェクト間で再利用できます。
COM1 と COM2 という 2 つの COM オブジェクトが、同じ ODBC データ・ソースに接続しており、同じトランザクションに加わっているとします。
COM1 が接続して稼働した後、切断すると接続がプール処理されます。しかし、この接続は同一トランザクションの別の COM オブジェクトで使用するために予約されます。現行のトランザクションが終了した後に限り、他のトランザクションで使用できます。
同一トランザクション中で COM2 が起動されると、プール処理された接続が使用されます。 MTS は、同一トランザクションに加わっている COM オブジェクトだけに確実に接続が使用されるようにします。
一方、COM1 が明示的に切断されない場合は、トランザクションが終了するまで接続は占有されます。同一トランザクション中で COM2 が起動されると、別の接続が使用されます。その後このトランザクションでは 1 つの接続ではなく 2 つの接続が占有されます。
同一トランザクションに加わっている COM オブジェクト間で接続を再利用する機能には、次のような利点があります。
同時に多数の物理接続や切断が行われるような作業負荷が大きい環境で、小さい CPTimeout 値が使用されていると、 TCP/IP スタックで資源に関する制約が生じることがあります。
この問題を軽減するには、TCP/IP レジストリー項目を使用してください。この点については、 Windows NT Resource Guide Volume 1 で説明されています。レジストリー・キー値は、 HKEY_LOCAL_MACHINE--> SYSTEM--> CurrentControlSet--> Services--> TCPIP--> Parameters にあります。
省略時値と推奨されている設定値は次のとおりです。
名前 | 省略時値 | 推奨値 |
---|---|---|
KeepAlive 時間 | 7200000 (2 時間) | 省略時値 |
KeepAlive 間隔 | 1000 (1 秒) | 10000 (10 秒) |
TcpKeepCnt | 120 (2 分) | 240 (4 分) |
TcpKeepTries | 20 (20 回再試行する) | 省略時値 |
TcpMaxConnectAttempts | 3 | 6 |
TcpMaxConnectRetransmission | 3 | 6 |
TcpMaxDataRetransmission | 5 | 8 |
TcpMaxRetransmissionAttempts | 7 | 10 |
レジストリー値が定義されていない場合は、作成してください。 |
MTS に付属の "BANK" サンプル・プログラムを使用して、クライアントの製品と MTS のセットアップをテストできます。
次のステップに従ってください。
[ODBC] DRIVER=IBM DB2 ODBC DRIVER UID=your_user_id PWD=your_password DSN=your_database_alias Description=MTS Samples
ここで、
db2 bind @C:\sqllib\bnd\db2cli.lst blocking all grant public
DRDA ホスト・サーバーをサーバーとして使用している場合は、接続先のホスト (OS/390、AS/400、または VSE&VM) に応じて、ddcsmvs.lst、 ddcs400.lst、または ddcsvm.lst をバインドします。たとえば、次のとおりです。
db2 bind @C:\sqllib\bnd\@ddcsmvs.lst blocking all grant public
あるいは、db2ubind.lst ファイルをバインドします。
db2 bind @C:\sqllib\bnd\@db2ubind.lst blocking all grant public
db2 create table account (accountno int, balance int) db2 insert into account values(1, 1)
DB2 CLI/ODBC アプリケーションを実行するには、次の構成キーワード (db2cli.ini ファイル中に設定されている) を省略時値から変更しないでください。
MTS サポートを使用できるようにするために作成された DB2 CLI アプリケーションが、上記のキーワードに対応している属性値を変更することのないようにしてください。また、アプリケーションが次の属性の設定値を変更しないようにしてください。
接続を確立するには、 MTS を使用するために作成した DB2 CLI/ODBC アプリケーションで ODBC 関数が使用されていなければなりません。
制限
複数サイト更新環境で組み込み SQL と CLI/ODBC 呼び出しを混合することはサポートされていますが、混合アプリケーションを作成する際の制約事項がすべて適用されます。詳細については、組み込み SQL と DB2 CLI の混合を参照してください。
プロセス・ベースの XA TP (CICS や Encina など) は、プロセス当たり 1 つのアプリケーション・サーバーを始動します。個々のアプリケーション・サーバー・プロセスで、接続はすでに XA API (xa_open) を使用して確立されています。ここでは、環境構成について説明し、この環境で稼働するよう DB2 CLI/ODBC アプリケーションを作成する方法について説明します。
XA トランザクション・マネージャーをセットアップするには、 管理の手引き の情報に従わなければなりません。
プロセス・ベースの XA TM の CLI/ODBC 構成キーワードの設定値は、 DB2 をトランザクション・マネージャーとして使用する場合と全く同じです。詳細については、構成 - DB2 をトランザクション・モニターとして使用する場合を参照してください。
この環境用の DB2 CLI/ODBC アプリケーションを作成する場合、そのアプリケーションが次のステップをすべて実行するようにしなければなりません。
制限
複数サイト更新環境で組み込み SQL と CLI/ODBC 呼び出しを混合することはサポートされていますが、混合アプリケーションを作成する際の制約事項がすべて適用されます。詳細については、組み込み SQL と DB2 CLI の混合を参照してください。
DB2 UDB クライアントが DB2 コネクトを使用してホストまたは AS/400 DB2 データベース・サーバーに接続している場合にも、複数サイト更新はサポートされます。
ホストまたは AS/400 データベース・サーバーに接続する際には、特定の DB2 CLI/ODBC 構成は必要ありません。
DB2 コネクトを実行しているマシンが、ホストに対して複数サイト更新モードで稼働できるようにするには、特定の構成設定値が必要になることがあります。詳しくは、ご使用のプラットフォームの DB2 コネクト 概説およびインストール を参照してください。