2.2.4 トランザクションの最適化
TP1/EEのトランザクションマネジャは,トランザクション処理の性能を上げるため,トランザクション関連定義のtrn_optimum_itemオペランドの指定に従って,次のような最適化の処理をしています。
-
1相最適化
-
リードオンリー最適化
それぞれの最適化には,最適化できる条件があります。条件を満たしたUAPを作成すると,トランザクション処理の性能を上げることができます。
1相最適化は,リードオンリー最適化より優先度が高い処理です。
トランザクションの最適化は,クライアント側のトランザクションブランチとサーバ側のトランザクションブランチとの間で,同期点処理の効率を上げることを目的としています。一つのグローバルトランザクション内で複数の最適化を混在できます。
(1) 通常のトランザクション処理(2相コミット)
TP1/EEでは,X/OpenのXAインタフェースによってトランザクションを制御しています。XAインタフェースでは,プリペア処理とコミット処理に分けて,トランザクションの同期点を取得しています。したがって,クライアントUAPとサーバUAPの間では,同期点処理要求の送信と確認の応答で,合計4回通信することになります。2相コミットの処理では,トランザクション処理のプロセスは同期点を取得するまで,次のサービス要求を受け取れません。
通常のトランザクション処理(2相コミット)の概要を,次の図に示します。
(2) 1相最適化
1相最適化の条件は,トランザクションブランチがサーバ側にあるか,クライアント側にあるかによって異なります。
- 注意事項
-
サーバ側のトランザクションブランチがあり,トランザクション処理でコミット時に実行される次の関数の呼び出しがあった場合は,1相最適化をしません。
-
ee_rpc_cmtsend関数【CBLEERPC('CMTSND ')】
-
ee_rpc_cmtsend_to関数【CBLEERPC('CMTSNDTO')】
-
ee_tim_execap関数【CBLEETIM('EXECAP ')】(acttypeにEETIM_COMT指定)
-
ee_mch_cmtsend関数【CBLEEMCH('CMTSND ')】
-
ee_mch_cmtsend_sync関数【CBLEEMCH('CMTSNDSY')】
-
ee_mcp_send関数【CBLEEMCP('SEND ')】(MCPを使用する場合)
次の場合には,トランザクション結果は不定となります。
-
1相最適化の実行中に通信障害やリソースマネジャ障害が発生し,ヒューリスティックハザード扱いとなった場合。
-
1相最適化の実行中にプロセスダウンが発生し,ロールバック扱いとなった場合。
-
- サーバ側のトランザクションブランチがある場合
-
1相最適化の条件を満たすと,クライアント側のトランザクションブランチがリソースマネジャへアクセスしないため,サーバ側のトランザクションブランチの同期点処理だけで済みます。このことで,2回分のプロセス間通信が不要になって,トランザクション処理の性能が上がります。
次に示す条件をすべて満たした場合に,1相最適化は実行されます。
-
トランザクション関連定義のtrn_optimum_itemオペランドにonephaseを指定している。
-
クライアント側のトランザクションブランチにリンケージされているリソースマネジャは,動的登録をするリソースマネジャだけである。
-
クライアント側のトランザクションブランチは,リソースマネジャへアクセスしていない。
-
クライアント側のトランザクションブランチには,子トランザクションブランチが一つだけである。
サーバ側のトランザクションブランチがある場合の1相最適化の概要を次の図に示します。
図2‒26 サーバ側のトランザクションブランチがある場合の1相最適化の概要 -
- クライアント側のトランザクションブランチだけの場合
-
1相最適化の条件を満たすと,クライアント側の同期点処理だけで済みます。このことで,リソースマネジャへのアクセス1回分が不要になり,トランザクション処理の性能が上がります。
次に示す条件をすべて満たした場合に,1相最適化は実行されます。
-
クライアント側のトランザクションブランチにリンケージされているリソースマネジャは一つだけである。
-
(3) リードオンリー最適化
リードオンリー最適化は,トランザクション関連定義のtrn_optimum_itemオペランドにreadonlyを指定したときだけ実行されます。
リードオンリー最適化の条件を満たすと,サーバ側のトランザクションブランチが更新処理をしていない場合に,同期点取得処理の2相目を実行しません。このことで,2回分のプロセス間通信が不要になって,トランザクション処理の性能が上がります。
次に示す条件をすべて満たした場合に,リードオンリー最適化は実行されます。
-
サーバ側のトランザクションブランチは,リソースの更新処理をしていない。
リードオンリー最適化の概要を次の図に示します。
- 注意事項
-
トランザクション処理でコミット時に実行される次の関数の呼び出しがあった場合は,リードオンリー最適化をしません。
-
ee_rpc_cmtsend関数
-
ee_rpc_cmtsend_to関数
-
ee_tim_execap関数(acttypeにEETIM_COMT指定)
-
ee_mch_cmtsend関数(XTCを使用する場合)
-
ee_mch_cmtsend_sync関数(XTCを使用する場合)
-
ee_mcp_send関数(MCPを使用する場合)
-