2.3.3 複数のDBMSを対象にトランザクション制御を行う方法(OpenTP1を使用する場合)

この方法では,DBMSへのアクセスは一つのDBMSを対象にトランザクション制御を行う方法と同じで,トランザクション制御の部分でTPBroker for C++が提供するOpenTP1を使用します。

<この項の構成>
(1) 動作概要
(2) OpenTP1を使用する場合のDABroker for C++の操作
(3) 注意事項

(1) 動作概要

OpenTP1を使用してトランザクション制御を行う場合の動作概要を図2-2に示します。OpenTP1のトランザクション制御は,X/Openで規定されたDTPモデルに準拠しており,ユーザアプリケーションをアプリケーションプログラムAP),HiRDBをリソースマネジャRM),トランザクション制御を行うOpenTP1をトランザクションマネジャTM)と呼びます。

図2-2 OpenTP1を使用してトランザクション制御を行う場合の動作概要

[図データ]

グローバルトランザクションを制御する場合,APはOpenTP1に対してトランザクションの開始・決着の要求を出します。このときDABroker for C++のDBTransactionクラスは使用せず,OpenTP1が提供するインタフェースを使用します。グローバルトランザクションの制御対象となっているデータベースに対して検索・更新処理をする場合はDABroker for C++のメソッドを使います。

HiRDBを使用する分散トランザクション環境の構築やグローバルトランザクションの制御方法については,OpenTP1のマニュアル,及びHiRDBのマニュアルを参照してください。

(2) OpenTP1を使用する場合のDABroker for C++の操作

HiRDBを使用した分散トランザクション環境で,SQLの処理をグローバルトランザクションの制御対象とするためには,DABroker for C++のメソッドを次のように使用する必要があります。

上記以外の動作についてはグローバルトランザクションの制御対象としない場合と変更ありません。

(3) 注意事項

(a) 排他制御に関する注意

複数のデータベースにアクセスする場合,排他制御の範囲はデータベース単位です。複数のデータベースにわたる排他制御はできません。つまり,一つのデータベース内でのデッドロックは検出されますが,複数のデータベース間にわたる待ち状態は検出されないことになります。このため,複数のデータベース間でデッドロックが発生するようなアプリケーションは設計しないでください。

(b) HiRDBのライブラリについて

アプリケーションが使用するHiRDBのライブラリは,静的登録・動的登録どちらの場合も各OSの複数接続機能に対応したシングルスレッド用のライブラリを使用してください。

(c) スレッドについて

OpenTP1上で動作するプログラムではスレッドを生成してはいけません。

DABroker for C++とHiRDBでもシングルスレッドに対応したライブラリを使用する必要があります。DABroker for C++が提供するシングルスレッドライブラリを使用する場合には,次の条件を満たす必要があります。

(d) グローバルトランザクションの制御対象としないアプリケーションの作成について

OpenTP1上で動作するプログラムではスレッドを生成しないでください。DABroker for C++とHiRDBでもシングルスレッドに対応したライブラリを使用する必要があります。詳細については「3.3.4(3)スレッドについて」を参照してください。