2.3.5 トランザクションの最適化
OpenTP1では,トランザクション処理の性能を上げるため,次のような最適化の処理をしています。
それぞれの最適化には,最適化できる条件があります。条件を満たしたUAPを作成すると,トランザクション処理の性能を上げることができます。
最適化の優先順位を次に示します。
5.6.7.>2.>3.>4.(1.はほかの最適化と同時に実行されます)
トランザクションの最適化は,クライアント側のトランザクションブランチとサーバ側のトランザクションブランチとの間で,同期点処理の効率を上げることを目的としています。そのため,一つのグローバルトランザクション内で複数の最適化を混在できます。
連鎖RPCを使うと,グローバルトランザクション内のトランザクションブランチの数が少なくなるので,トランザクションをより効率的に実行できます。
- 〈この項の構成〉
(1) 通常のトランザクション処理(2相コミット)
OpenTP1では,X/OpenのXAインタフェースによってトランザクションを制御しています。XAインタフェースでは,プリペア処理とコミット処理に分けて,トランザクションの同期点を取得しています。このような同期点処理を,2相コミットといいます。したがって,クライアントUAPとサーバUAPの間では,同期点処理要求の送信と確認の応答で,合計4回通信することになります。2相コミットの処理では,トランザクション処理のプロセスは同期点を取得するまで,次のサービス要求を受け取れません。
通常のトランザクション処理(2相コミット)の概要を,次の図に示します。
|
(2) コミット最適化
コミット最適化の条件を満たすと,サーバ側のトランザクションブランチで実行する同期点処理の2相目(コミット処理/ロールバック処理)を,クライアント側のトランザクションブランチで実行します。このことで,2回分のプロセス間通信が不要になって,トランザクション処理の性能が上がります。
次に示す条件をすべて満たした場合に,コミット最適化は無条件に実行されます。
-
クライアント側のトランザクションブランチと,サーバ側のトランザクションブランチが,同じOpenTP1システム内にある。
-
サーバ側のトランザクションブランチでアクセスしたリソースマネジャのXAインタフェースオブジェクトファイルが,クライアント側のトランザクションブランチにもリンケージされている。
コミット最適化をした場合,サーバ側のトランザクションブランチは,同期点処理の1相目が終了した時点で,2相目の完了を待たないで,次のサービス要求を受け付けられます。
コミット最適化の概要を次の図に示します。
|
(3) プリペア最適化
プリペア最適化の条件を満たすと,サーバ側のトランザクションブランチで実行する同期点処理の1相目(プリペア処理)を,クライアント側のトランザクションブランチで実行します。このことで,2回分のプロセス間通信が不要になって,トランザクション処理の性能が上がります。
次に示す条件をすべて満たした場合に,プリペア最適化は無条件に実行されます。
-
クライアント側のトランザクションブランチと,サーバ側のトランザクションブランチが,同じOpenTP1システム内にある。
-
サーバ側のトランザクションブランチでアクセスしたリソースマネジャのXAインタフェースオブジェクトファイルが,クライアント側のトランザクションブランチにもリンケージされている。
-
クライアント側のトランザクションブランチは,同期応答型RPC(dc_rpc_call関数のflagsにDCNOFLAGSを設定)を使っている。
プリペア最適化をした場合は,コミット最適化も実行できるため,4回のプロセス間通信を削減できます。また,サーバ側のトランザクションブランチでは,同期点処理の完了を待たないで,次のサービス要求を受け付けられます。
プリペア最適化の概要を次の図に示します。
|
(4) 非同期プリペア最適化
非同期プリペア最適化の条件を満たすと,サーバ側のトランザクションブランチがサービス処理が終了した時点で,クライアント側のトランザクションブランチへリターンする前に,プリペア処理を実行します。このことで,2回分のプロセス間通信が不要になって,トランザクション処理の性能が上がります。
次に示す条件をすべて満たした場合に,非同期プリペア最適化は実行されます。
-
クライアント側のUAPで,ユーザサービス定義のtrn_optimum_itemオペランドにasyncprepareを指定している。
-
プリペア最適化が実行できない条件であること(実行できる場合は,プリペア最適化が非同期プリペアよりも優先される)。
-
クライアント側のトランザクションブランチは,同期応答型RPC(dc_rpc_call関数のflagsにDCNOFLAGSを設定)を使っている。
非同期プリペア最適化をした場合,RPCの応答時間が通常のトランザクション処理よりも長くなります。また,クライアント側のトランザクションブランチのOpenTP1が,トランザクション処理中に異常終了した場合,ジャーナル取得の関係で,サーバ側のトランザクションブランチのOpenTP1も異常終了する場合があります。
非同期プリペア最適化の概要を次の図に示します。
|
(5) 1相最適化
1相最適化の条件を満たすと,クライアント側のトランザクションブランチがリソースマネジャへアクセスしないため,サーバ側のトランザクションブランチの同期点処理だけで済みます。このことで,2回分のプロセス間通信が不要になって,トランザクション処理の性能が上がります。
次に示す条件をすべて満たした場合に,1相最適化は実行されます。
-
クライアント側のトランザクションブランチにリンケージされているリソースマネジャは,動的登録をするリソースマネジャだけである。
-
クライアント側のトランザクションブランチは,リソースマネジャへのアクセスやユーザジャーナルの出力をしていない。
-
クライアント側のトランザクションブランチには,子トランザクションブランチが一つだけである。
1相最適化の概要を次の図に示します。
|
(6) リードオンリー最適化
リードオンリー最適化の条件を満たすと,サーバ側のトランザクションブランチが更新処理をしていない場合に,同期点処理の2相目を実行しません。このことで,2回分のプロセス間通信が不要になって,トランザクション処理の性能が上がります。
次に示す条件をすべて満たした場合に,リードオンリー最適化は実行されます。
-
サーバ側のトランザクションブランチは,リソースの更新処理(参照処理は除く),およびユーザジャーナルの出力をしていない。
-
クライアント側のトランザクションブランチには,子トランザクションブランチが一つだけである。
リードオンリー最適化をした場合,サーバ側のトランザクションブランチは,同期点処理の1相目が終了した時点で,2相目の完了を待たないで,次のサービス要求を受け付けられます。
リードオンリー最適化の概要を次の図に示します。
|
(7) ノーアクセス最適化
ノーアクセス最適化の条件を満たすと,サーバ側のトランザクションブランチがリソースマネジャへアクセスしていない場合,同期点処理をしません。このことで,4回分のプロセス間通信が不要になって,トランザクション処理の性能が上がります。
次に示す条件をすべて満たした場合に,ノーアクセス最適化は実行されます。
-
クライアント側のトランザクションブランチは,同期応答型RPC(dc_rpc_call関数のflagsにDCNOFLAGSを設定)を使っている。
-
サーバ側のトランザクションブランチにリンケージされているリソースマネジャは,動的登録をするリソースマネジャだけである。
-
サーバ側のトランザクションブランチは,リソースマネジャへのアクセス,およびユーザジャーナルへの出力をしていない。
-
サーバ側のトランザクションブランチには,子トランザクションブランチがない。または子トランザクションブランチが存在しても,その子トランザクションブランチはリードオンリー最適化ができる状態である。
ノーアクセス最適化をした場合,サーバ側のトランザクションブランチは,同期点処理の完了を待たないで,次のサービス要求を受け付けられます。
ノーアクセス最適化の概要を次の図に示します。
|
(8) ロールバック最適化
ロールバック最適化の条件を満たすと,サーバ側のトランザクションブランチで,ロールバックの関数を使った場合,ほかのトランザクションブランチと同期を取らないでロールバックします。また,ほかのトランザクションブランチは同期点処理の1相目を実行しません。このことで,2回分のプロセス間通信が不要になって,トランザクション処理の性能が上がります。
次に示す条件をすべて満たした場合に,ロールバック最適化は実行されます。
-
クライアント側のトランザクションブランチは,同期応答型RPC(dc_rpc_call関数のflagsにDCNOFLAGSを設定)を使っている。
-
サーバ側のトランザクションブランチで,ロールバック関数を使っている。
ロールバック最適化をした場合,サーバ側のトランザクションブランチは,同期点処理の完了を待たないで,次のサービス要求を受け付けられます。
ロールバック最適化の概要を次の図に示します。
|
(9) 連鎖RPCを使った最適化
通常,トランザクションブランチからトランザクション属性を指定したUAPへサービスを要求すると,サーバ側のトランザクションブランチのプロセスは,別のトランザクションブランチとして実行されます。ただし,同じサービスグループ(同じサービスでなくても良い)へ連鎖RPC(dc_rpc_call関数のflagsにDCRPC_CHAINEDを設定)を使うと,その連鎖RPCを終了するまで一つのトランザクションブランチとして実行されます。連鎖RPCの条件を満たすと,グローバルトランザクション内のトランザクションブランチの数が削減されて,トランザクション処理の性能が上がります。
連鎖RPCを使った最適化の概要を次の図に示します。
|