2.6.3 提供APIエラー
SDBハンドラ機能が提供するAPIの延長でエラーが発生した場合,エラー内容に応じて次の動作を行います。
(1) デッドロック
デッドロックまたは排他待ち時間超過が発生した場合,sdh_deadlock_modeオペランド指定値に従い後処理を行います。指定値ごとのエラー後動作を次に示します。
-
「continue」
デッドロックを意味するSDHステータスコードを設定し,提供APIがエラーリターンします。このとき,SDBハンドラでは,ee_trn_rollback_mark(トランザクションのロールバック指示)は発行しません。そのため,ユーザは,必要に応じて後処理(ロールバック,リトライなど)を行ってください。ただし,HiRDBで暗黙的ロールバックが発生した場合は,本指定値であっても「rollback_mark」と同じ処理を行います。
-
「rollback_mark」(デフォルト)
ee_trn_rollback_mark(トランザクションのロールバック指示)を発行し,デッドロックを意味するSDHステータスコードを設定し,提供APIがエラーリターンします。以降,当該トランザクションでは,個別終了以外のSDBハンドラ提供APIが使用できません。使用した場合は提供APIがエラーリターンします。ee_trn_rollback_mark()の詳細については,マニュアル「OpenTP1 Version7 分散トランザクション処理機能 TP1/Server Base Enterprise Option プログラム作成の手引」を参照してください。
-
「rollback_retry」
ee_trn_retry_rollback(リトライモードのロールバック)を発行します。提供APIはリターンしないで,スレッドダウンします。リトライ回数が上限未満であればサービス関数を再実行します。リトライ回数が上限以上の場合は,サービス関数を再実行しないで,E3トランザクション起動します。ee_trn_retry_rollback()の発行条件(MN,TMトランザクション以外など)を満たしていない場合は,「rollback_mark」と同じ処理を行います。ee_trn_retry_rollback()の詳細については,マニュアル「OpenTP1 Version7 分散トランザクション処理機能 TP1/Server Base Enterprise Option プログラム作成の手引」を参照してください。
判定方法を次の表に示します。
表2‒33 デッドロック一覧 項番
判定方法
1
デッドロック
HiRDBへのSDBデータベースアクセス要求がSQLCODEコード「-911」で失敗。
なお,HiRDBサーバ定義がpd_lck_deadlock_check=Yの場合だけデッドロックが検知できます。
2
排他待ち時間超過
HiRDBへのSDBデータベースアクセス要求がSQLCODEコード「-770」で失敗。
(2) 無排他モードの参照系DBアクセスと更新系DBアクセスが競合
無排他モードによる参照系DBアクセス中,他トランザクションが更新系SDBデータベースアクセスで同一レコードにアクセスした場合,参照系DBアクセスは失敗します。その後,sdh_nlocksqlerr_modeオペランド指定値に従い後処理を行います。次に,指定値ごとのエラー後動作を示します。
-
「continue」
デッドロックを意味するSDHステータスコードを設定し,提供APIがエラーリターンします。このとき,SDBハンドラでは,ee_trn_rollback_mark(トランザクションのロールバック指示)は発行しません。そのため,ユーザは,必要に応じて後処理(ロールバック,リトライなど)を行ってください。ただし,HiRDBで暗黙的ロールバックが発生した場合は,本指定値であっても「rollback_mark」と同じ処理を行います。
-
「rollback_mark」(デフォルト)
ee_trn_rollback_mark(トランザクションのロールバック指示)を発行し,デッドロックを意味するSDHステータスコードを設定し,提供APIがエラーリターンします。以降,当該トランザクションでは,個別終了以外のSDBハンドラ提供APIが使用できません。使用した場合は提供APIがエラーリターンします。
-
「rollback_retry」
ee_trn_retry_rollback(リトライモードのロールバック)を発行します。提供APIはリターンしないで,スレッドダウンします。リトライ回数が上限未満であればサービス関数を再実行します。リトライ回数が上限以上の場合は,サービス関数を再実行しないで,E3トランザクション起動します。ee_trn_retry_rollback()の発行条件(MN,TMトランザクション以外など)を満たしていない場合は,「rollback_mark」と同じ処理を行います。
(3) その他のエラー
デッドロック以外のエラーが発生した場合,KFSB54304-Eメッセージ出力後※,エラーに対応するSDHステータスコードを設定し,提供APIがエラーリターンします。このとき,続行可能なSDHステータスコードを除き,以降,当該インタフェースエリアでは,個別終了以外のSDBハンドラ提供APIが使用できません。使用した場合は提供APIがエラーリターンします。続行可能なSDHステータスコードを次の表に示します。また,SDBハンドラでは,ee_trn_rollback_mark(トランザクションのロールバック指示)を発行しません。そのため,ユーザは,必要に応じて後処理(ロールバック,リトライなど)を行ってください。ただし,HiRDBで暗黙的ロールバックが発生した場合,またはSDBデータベースアクセス続行不可能なSDHステータスコードが発生した場合は,SDBハンドラでee_trn_rollback_mark(トランザクションのロールバック指示)を発行し,エラーに対応するSDHステータスコードを設定し,提供APIがエラーリターンします。以降,当該トランザクションでは,個別終了以外のSDBハンドラ提供APIが使用できません。使用した場合は提供APIがエラーリターンします。SDBデータベースアクセス続行可能なSDHステータスコードを表2-34に,続行不可能なSDHステータスコードを表2-35に示します。
- 注※
-
環境変数EEPARM1に「00000004」を指定した場合だけ,ログに出力します。
表2‒34 SDBデータベースアクセス続行可能なSDHステータスコード一覧 項番
SDHステータスコード
項番
1
00000
正常終了。
2
00100
レコードが見つかりません。
3
01810
レコードはすでに存在します。
4
10072
データの終わりを検出しました。
表2‒35 SDBデータベースアクセス続行不可能なSDHステータスコード一覧 項番
SDHステータスコード
意味
1
11279
MAM/TAMデータベースに格納するデータのユーザキーがLASTポインタが示すレコードのユーザキーより小さいかまたは同じです。