3.4.16 交替用メッセージ表書き込み機能
TP1/FSPを使用している場合だけ使用できます。
この機能は,次に示す項目を設定することで使用できます。
-
TP1/FSP定義のtrn_max_retry_countを省略,または0以外の値を指定します。
-
TP1/EE定義のdbqgrpdef -k 1を指定します。
-
eedbqtblhコマンド実行時に-aオプションに8を論理和で指定してDBキューを作成します。
この機能を使用すると,DBキューのメッセージ表を格納したRDエリアの容量不足,RDエリアの閉塞などの障害が発生したときに,交替用のメッセージ表に書き込み,トランザクションをコミットします。これによって業務が継続でき,可用性が向上します。メッセージ表以外のDBキューの表で障害が発生した場合は,この機能は動作しません。
この機能を使用していない場合,DBキューのメッセージ表を格納したRDエリアの容量不足,RDエリアの閉塞などの障害が発生したときに,DBキューに書き込み要求(ee_dbq_msgput関数)を行ったトランザクションは,ロールバックします。
(1) 交替用メッセージ表へのメッセージの書き込み
書き込み要求を実行したトランザクションでは,同期点処理でDBキューにメッセージを書き込みます。DBキューのメッセージ表の更新で障害が発生した場合は※,DBキュー機能は,トランザクションをリトライロールバックさせます。APがリトライロールバック後のトランザクションで再度書き込み要求を実行すると,DBキュー機能は,交替用のメッセージ表にメッセージを書き込み,トランザクションをコミットします。
DBキューの通常のメッセージ表と交替用のどちらの表に書き込むかはDBキュー機能が決めるため,APはリトライロールバック後のトランザクションとリトライロールバック前のトランザクションで処理を変える必要がありません。
- 注※
-
HiRDBで暗黙的ロールバックが発生しない障害の場合は,リトライロールバックしないで同一トランザクションで交替用メッセージ表を更新します。
図3‒45 交替用メッセージ表へのメッセージの書き込み
-
UAPがメッセージ書き込み要求関数処理を実行し,DBキュー機能が要求を受け付けます。
-
DBキュー機能がメッセージ表を更新します。HiRDBが暗黙的にロールバックする障害が発生します。
-
DBキュー機能がリトライロールバック要求をします。
-
同一のメッセージを入力としたトランザクションを再起動します。
-
UAPが1.と同じAPIを実行し,DBキュー機能が要求を受け付けます。
-
交替用メッセージ表を更新します。
一度交替用のメッセージ表に書き込みを行うと,後続のトランザクションでは交替用の表にメッセージを書き込みます。通常のメッセージ表の障害を取り除いたあとに,eedbqaltputコマンドを実行すると,通常のメッセージ表への書き込みに戻ります。現在どちらの表に書き込む状態かは,eedbqlsコマンドで確認できます。
交替用のメッセージ表の更新でも障害が発生した場合は,トランザクションはロールバックしERRTRNRが実行されます。書き込み禁止機能を使用している場合は,書き込み禁止状態にします。
交替用メッセージ表書き込み機能によってリトライロールバックした場合も,TP1/FSPの機能によってリトライロールバックした場合と同様にリトライ回数をカウントアップし,リトライ回数を超過した場合は,リトライしないでERRTRN3を起動します。
リトライロールバック前処理UOCでリトライロールバックをキャンセルした場合もリトライしないでERRTRN3を起動します。リトライロールバックをキャンセルすると交替用メッセージ表への書き込みは行われません。
DBキューのメッセージ表以外の表(ライト管理表,リード管理表)の更新で障害が発生した場合は,この機能を使用していない場合と同様に,DBキューに書き込み要求を行ったトランザクションはロールバックします。
(2) 交替用メッセージ表からのメッセージの入力
UAP間通信用DBキューからのメッセージ入力およびAPI※によるメッセージ読み出し・参照時は,交替用メッセージ表書き込み機能が通常のメッセージ表と交替用のメッセージ表のどちらにメッセージが書き込まれているかを判断してメッセージを入力します。UAPはどちらの表にメッセージが書き込まれたかを意識する必要はありません。
ただし,どちらの表にメッセージが書き込まれたかを判断するためのメッセージ表,または交替用メッセージ表へのアクセスでHiRDBが暗黙的ロールバックする障害が発生した場合は,リトライロールバックしてスレッドダウンします。UAP間通信用DBキューからのメッセージ入力での障害では,UAPの処理は開始していないためリトライロールバック前処理UOCは呼び出しません。また,リトライロールバック回数をカウントしません。
- 注※
-
次のAPIが該当します。
-
ee_dbq_msgget関数
-
ee_dbq_msgrefer関数
-
ee_dbq_msgrefer2関数
-
ee_dbq_msgrefer2関数を例に交替用メッセージ表からのメッセージを入力する処理の流れを次に示します。
-
UAPがメッセージ入力関数処理を実行し,DBキュー機能が要求を受け付けます。
-
DBキュー機能がメッセージ表から入力します。HiRDBが暗黙的にロールバックする障害が発生します。
-
DBキュー機能がリトライロールバック要求をします。
-
スレッドダウンし,同一のメッセージを入力としたトランザクションを再起動します。
-
UAPが1.と同じAPIを実行し,DBキュー機能が要求を受け付けます。
-
交替用メッセージ表から入力します。
-
次から交替用メッセージ表から先に確認される状態に更新します。
ふだんは,通常のメッセージ表から先に確認します。一度交替用のメッセージ表から未読み出しメッセージを入力した場合は,次のトランザクションからは,交替用のメッセージ表から先に確認される状態に切り替えます。再び通常のメッセージ表から未読み出しメッセージを入力した場合は,次のトランザクションからは,通常のメッセージ表から先に確認される状態に戻ります。
(3) 交替用メッセージ表書き込み機能の使用時の制限事項
(a) DBキューの関数を使用できるトランザクションの制限
交替用メッセージ表書き込み機能の使用時は,次の関数の使用を制限します。
-
ee_dbq_msgput関数
-
ee_dbq_msgget関数
-
ee_dbq_msgrefer関数
-
ee_dbq_msgrefer2関数
交替用メッセージ表書き込み機能の使用時にこれらの関数を使用できるトランザクション種別を,次に示します。ほかのトランザクション種別で実行した場合は,エラーリターンします。
MN,TM,CU,およびこれらのトランザクションの再起動トランザクション(RM)
(b) リトライロールバック機能の仕様による制限
交替用メッセージ表書き込み機能は,リトライロールバック機能を使用して実現しています。そのため,リトライロールバック機能が使用できない次の条件を満たす場合は,メッセージ表の書き込みで障害が発生しても交替用メッセージ表への書き込みは行わないで,トランザクションがロールバックします。
-
トランザクショナル連携ありのRPC受信時のトランザクション
-
トランザクショナルRPCを発行したトランザクション
-
RPC応答メッセージ抑止をしたトランザクション