4.7.2 デッドロック時のOpenTP1の処置
デッドロックが起こった場合,OpenTP1はUAPの排他待ち優先順位に従って,優先順位の低いUAPプロセスからの排他要求をエラーリターンさせます。UAPの排他待ち優先順位は,ユーザサービス定義のdeadlock_priorityオペランドに指定します。
(1) デッドロック時のUAPの処置
デッドロックが原因で,資源を確保しようとした関数がエラーリターンした場合,UAPでは次のように対処してください。
(a) SUP,SPPでデッドロックが起こったときの処置
SUP,またはSPPの処理でデッドロックが起こった場合は,ロールバックの関数(dc_trn_unchained_rollback関数,dc_trn_chained_rollback関数,tx_rollback関数)でトランザクションをロールバックさせてください。デッドロックでロールバックしたSUP,またはSPPは再実行(リトライ)しません。もう一度該当するサービスをクライアントUAPから要求し直してください。
(b) MHPでデッドロックが起こったときの処置
MHPの処理でデッドロックが起こった場合は,dc_mcf_rollback関数でロールバックしてください。再実行(リトライ)するかどうかは,dc_mcf_rollback関数の引数に指定します。
(2) デッドロック情報,タイムアウト情報の出力
デッドロックが起こった場合,デッドロックの原因となったUAPの詳細情報を,ロックサービスがあるノードのディレクトリに出力できます。この情報をデッドロック情報といいます。
資源の解放を待っているUAPが,ロックサービス定義のlck_wait_timeoutオペランドに指定した時間を超えた場合,UAPで呼び出した関数はエラーリターンします。このとき,確保しようとした資源に関する詳細情報を,ロックサービスがあるノードのディレクトリに出力できます。この情報をタイムアウト情報といいます。
デッドロック情報,タイムアウト情報を出力するかどうかは,ロックサービス定義のlck_deadlock_infoオペランドに指定します。
デッドロック情報,タイムアウト情報の出力形式については,「付録B デッドロック情報の出力形式」を参照してください。
(3) 複数のリソースマネジャでデッドロックが起こった場合のOpenTP1の処置
複数のリソースマネジャにアクセスするUAP同士でデッドロックが起こった場合の,OpenTP1の処置を示します。
(a) OpenTP1で排他制御するRM(DAM,TAM)同士のデッドロックの場合
ユーザサービス定義のdeadlock_priorityオペランドに指定した,UAPの排他待ち優先順位の値に従って,処置します。
(b) OpenTP1で排他制御するRM(DAM,TAM)と 他社RMとのデッドロックの場合
ロックサービス定義のlck_wait_timeoutオペランドに指定した排他待ち限界経過時間で監視します。RM固有に指定した限界経過時間は参照しないので,ロックサービス定義の排他待ち限界経過時間は必ず指定しておいてください。
(c) 他社RMと他社RMとのデッドロックの場合
RM固有に指定した限界経過時間も,ロックサービス定義の排他待ち限界経過時間も参照しません。この場合,OpenTP1はトランザクションの限界経過時間でUAPを監視します。ユーザサービス定義,ユーザサービスデフォルト定義,トランザクションサービス定義のtrn_expiration_timeオペランドに指定した値を超えた場合に,該当するUAPのプロセスを異常終了させます。