Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成の手引


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 デッドロック情報の出力形式」を参照してください。

(a) デッドロック情報,タイムアウト情報の削除

デッドロック情報,タイムアウト情報を削除する方法を次に示します。

  • コマンドで削除する方法

    lckrminfコマンドを実行します。

  • OpenTP1の開始時に,前回までのオンラインで作成した情報を削除する方法

    ロックサービス定義のlck_deadlock_info_removeオペランドlck_deadlock_info_remove_levelオペランドに,削除する条件を指定しておきます。

(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のプロセスを異常終了させます。