2.4.5 トランザクションシーケンス
OpenTP1 for .NET FrameworkとDBMSとの連携で使用するメソッドは,次に示す順番で発行します。
-
DBMSとのコネクションの生成,オープン
-
データベースアクセス処理
-
コネクションの解放
XAインタフェースによるトランザクション連携は,Extension .NETが提供するRpcクラスおよびTrnクラスと,DABroker for .NET Frameworkデータプロバイダのクラスを組み合わせることで実現します。このときのメソッドの正しい発行順序を,トランザクションシーケンスと呼びます。UAPを作成するユーザは,トランザクションシーケンスを意識する必要があります。トランザクションシーケンスが不正な場合は,次のような障害が発生する可能性があるため,注意してください。
-
DABroker for .NET Frameworkが提供するクラスの呼び出しに失敗する
-
データベースが正しく更新できない
(1) SPP.NETのトランザクションシーケンス
SPP.NETには,次の3種類のメソッドが実装されています。
-
InitializeSPPメソッド
-
FinalizeSPPメソッド
-
サービスメソッド
これらのメソッドの中で,OpenTP1のグローバルトランザクションに参加できるメソッドはサービスメソッドだけです。そのため,XAインタフェースによるトランザクション連携をするDBMSに対してのデータベースアクセス処理は,サービスメソッド内で実行してください。InitializeSPPメソッドおよびFinalizeSPPメソッド内では,XAインタフェースによるトランザクション連携をするDBMSに対してのデータベースアクセス処理はできません。また,コネクションの生成およびオープンは,グローバルトランザクションの状態に関係なく実行できます。
なお,XAインタフェースによるトランザクション連携をしないDBMSに対するデータベースアクセス処理は,3種類のメソッド中のどのメソッドでも実行できます。
SPP.NETのトランザクション連携種別を次の図に示します。
|
(a) InitializeSPPメソッド内でDBMSと接続する場合
InitializeSPPメソッド内でDBMSと接続する場合のメソッドの発行位置を,次の図に示します。
|
-
InitializeSPPメソッド内でコネクションを生成,オープンします。
-
サービスメソッド内でデータベースアクセス処理をします。
-
FinalizeSPPメソッド内でコネクションを解放します。
InitializeSPPメソッド内で作成したコネクションは,FinalizeSPPメソッドまで使用できます。
DABroker for .NET Frameworkを使用してDBMSとトランザクション連携をする場合は,この方式での接続を推奨します。
(b) サービスメソッド内でDBMSと接続する場合
サービスメソッド内でDBMSと接続する場合は,次の図に示すとおり,コネクションの生成およびオープンだけでなく,データベースアクセス処理,およびコネクションの解放もサービスメソッド内で実行します。
|
この場合,サービスメソッドを実行する場合にだけDBMSと接続するので,リソースの消費を最小限に抑えられます。ただし,コネクションの生成,オープン,および解放をサービスメソッドの呼び出しごとに実行するため,処理に伴うオーバヘッドを考慮する必要があります。
(2) SUP.NETのトランザクションシーケンス
SUP.NETは,次に示す流れに沿って処理をします。
-
RPCのオープン
-
SUP.NETの開始処理の完了報告
-
トランザクションの開始
-
サービスの実行
-
トランザクションの終了
-
RPCのクローズ
XAインタフェースによるトランザクション連携をするDBMSに対してのデータベースアクセス処理は,4.の部分でだけ実行できます。この場合,コネクションの生成およびオープンも,4.の部分で実行します。
XAインタフェースによるトランザクション連携をしないDBMSに対してのデータベースアクセス処理は,SUP.NETのメイン関数内であればどこでも実行できます。コネクションの生成およびオープンも同様です。
SUP.NETのトランザクション連携種別を次の図に示します。
|
-
RPCのオープン
-
SUP.NETの開始処理の完了報告
-
トランザクションの開始
-
サービスの実行
-
トランザクションの終了
-
RPCのクローズ
DBMSとXAインタフェースによるトランザクション連携をする場合,SUP.NETのトランザクションシーケンスは,次の図のとおりになります。
|