3.2.2 グローバルトランザクション
UAPでRPCを使うと,トランザクションは複数のUAPにわたって構成されます。複数のUAPで構成されるトランザクションを,グローバルトランザクションといいます。グローバルトランザクションを構成する各UAPを,トランザクションブランチといいます。特に,トランザクションの開始を宣言したUAPをルートトランザクションブランチといいます。また,一つのトランザクションブランチから生成されたトランザクションブランチを子トランザクションブランチといい,子トランザクションブランチを生成したトランザクションブランチを親トランザクションブランチといいます。
各グローバルトランザクションの間には,関連がありません。グローバルトランザクションとしてRPCが使えるのは,TP1/EE同士,またはTP1/EEとTP1/Server Baseとの間です。TP1/EEとTP1/Clientとの間でRPCを使ってトランザクション連携することはできません。
(1) グローバルトランザクションの構造
TP1/EEのトランザクションサービスでのグローバルトランザクションの構造を次の図に示します。
一つのトランザクションブランチは,常に一つのグローバルトランザクションに属します。一つのスレッドは,常に一つのトランザクションブランチに結合します。
一つのリソースマネジャは,複数のトランザクションブランチからアクセスされる可能性,および複数のグローバルトランザクションに属する可能性があります。いったん結合したトランザクションブランチとリソースマネジャは,グローバルトランザクションが完了するまで,結合したままの状態になります。
(2) グローバルトランザクションID
グローバルトランザクションIDは,グローバルトランザクションを識別するために使用します。
グローバルトランザクションIDは,一意である必要があります。TP1/EEでは,グローバルトランザクションの開始時刻,グローバルトランザクション通番,およびルートトランザクションブランチがあるTP1/EEのシステム識別子を使用してグローバルトランザクションIDを作成することによって一意性を保証します。
TP1/EE再開始時のグローバルトランザクション通番は,前回のオンラインで最後に使用したグローバルトランザクション通番の次の番号から使用されます。グローバルトランザクション通番は,TP1/EE再開始時のグローバルトランザクション通番が更新されるときに,ステータスファイルに開始CJ(トランザクション開始時に取得するステータスファイル)として出力されます。
ただし,マシンの時刻を変更した場合は,グローバルトランザクションIDが一意ではなくなるおそれがあります。TP1/EEでは,時刻を変更する場合,adjtime()システムコールのように,常に単調に時刻の値を増加させながら増加の速度を速くしたり遅くしたりすることで時刻を補正する機能を使用することをお勧めします。
- 注意事項
-
TP1/EEの開始中,オンライン中,または停止中には,時刻を変更しないでください。何らかのテストで時刻を進める必要がある場合は,TP1/EEを停止させたあとで時刻を進めてください。何らかのテストで時刻を遅らせる必要がある場合は,TP1/EEを終了し,ステータスファイルをすべて初期化したあとで時刻を遅らせてください。時刻を遅らせたあとに,TP1/EEを起動してください。
(3) TP1/Server Baseとのトランザクション連携
次に示すどちらかの場合,TP1/EEとTP1/Server Baseとの間でトランザクション連携をします。
-
TP1/EEがクライアントUAPで,ee_rpc_call関数のflagsオプションにEERPC_TPNOTRANを指定しない場合,かつ,TP1/Server Baseがトランザクション属性のサーバUAPの場合
-
TP1/Server Baseがトランザクション属性のクライアントUAPで,dc_rpc_call関数のflagsオプションにDCRPC_TPNOTRANを指定しない場合
TP1/EEとTP1/Server Baseとの間でトランザクション連携をするときは,グローバルトランザクション内でコミットやロールバックをするために,RPCと連携して同期点メッセージを送受信します(トランザクショナルRPC)。
TP1/EEとTP1/Server Baseとの間でトランザクション連携をする場合は,RPC関連定義のname_useオペランドにYを指定してください。
- 注意事項
-
-
オンラインテスタを起動した状態のTP1/Server BaseとTP1/EEとの間では,トランザクション連携をすることはできません。
-
非同期プリペア最適化を実行したTP1/Server Baseとの間でトランザクション連携をする場合,TP1/EE側では非同期プリペア最適化を実行しません。
-