9.14.1 デッドロック監視処理時間の変更方法
デッドロックの検出方法がインターバル監視方式の場合(pd_lck_pool_partition又はpd_fes_lck_pool_partitionオペランドに2以上を指定した場合),デッドロックの監視間隔の間にデッドロックが多発するおそれがあり,デッドロックが多発すると,デッドロック監視処理にて検出するまでに長時間掛かることがあります。デッドロック監視処理中は,排他取得や排他解除を行えないため,トランザクションが長時間無応答になります。
pd_lck_deadlock_check_timeoutオペランドに0以外の値を指定することで,デッドロック監視処理に時間が掛かる場合に監視処理を中断し,排他取得や排他解除ができるようになり,トランザクション処理を続行できます。
トランザクションとデッドロック監視処理の関係について,次の図に示します。
(1) デッドロック監視中断後の監視処理正常化までの流れ
デッドロック監視処理を中断した場合,デッドロックに関連しているトランザクションは,排他待ち限界経過時間(PDLCKWAITTIMEやpd_lck_wait_timeoutなど)やHiRDBクライアントの最大待ち時間(PDCWAITTIME)経過後にロールバックすることで,デッドロックが解消されます。
また,デッドロックに関連していないトランザクションもデッドロック監視処理中は排他取得や排他解除ができないが,デッドロック監視中断後には排他取得や排他解除ができ,トランザクションを続行できます。
上記により,デッドロックの数が少なくなることでデッドロック監視処理が監視時間内に正常に終了するようになります。
(2) 関連する設定
各UAPやユティリティは排他待ち限界経過時間やHiRDBクライアントの最大待ち時間などのトランザクションのタイムアウト時間を指定してください。タイムアウトすることでデッドロックが解消し,この機能によって中断したデッドロック監視処理を正常化します。関連する各オペランドの指定の目安については,マニュアル「HiRDB システム定義」を参照してください。
-
pd_lck_deadlock_check_timeout
-
pd_lck_deadlock_check_pause
(3) デッドロック監視処理再開までの流れ
デッドロック監視処理が中断する際,KFPS00453-Eメッセージを出力します。その後,pd_lck_deadlock_check_pauseオペランド指定値時間スリープした後デッドロック監視処理を実行します。連続してデッドロック監視処理が中断した場合,KFPS00453-Eメッセージは最初の1回だけ出力します。
デッドロック監視処理が中断した後にデッドロック監視処理が完了した場合,KFPS00454-Iメッセージを出力します。その後,pd_lck_deadlock_check_interval指定値ごとに監視する処理に戻ります。
デッドロック監視処理を中断してから再開するまでの動作を次の図に示します。