3.4.9 DBキューの通番の管理
TP1/EEによってDBキューにメッセージが書き込まれるのは,サービストランザクション(メッセージ書き込み要求を行うトランザクション)の同期点処理のタイミングです。TP1/EEでは,このときの書き込みの順番を通番管理しています。
サービストランザクション中でee_dbq_msgput関数が発行され,DBキューへのメッセージ書き込み要求が行われると,同期点処理でメッセージを書き込む順番にメッセージに通番が設定されます。この通番は,1から順番に昇順で設定され,番号が抜け落ちることはありません。
通番がdbqdef定義コマンドの-lオプションで指定した最大書き込みメッセージ数に達した場合の動作は,eedbqtblhコマンドでDBキューを作成するときの,-aオプションに指定する属性によって設定できます。
- 〈この項の構成〉
(1) DBキューの上書き抑止
1日の業務のメッセージを確実に保持して運用したい場合など,一定期間メッセージを上書きしないで保持したい場合,DBキューに上書きを抑止するための属性(上書き抑止属性)を設定してください。読み出し済みのメッセージを保持する必要がない場合は,上書き抑止属性を設定しないでください。
- 上書き抑止属性を設定する場合の動作(eedbqtblhコマンドの-aオプションに3を指定)
-
通番が最大書き込みメッセージ数に達すると,メッセージの書き込み要求をしたトランザクションをロールバックします。サービス関数のリターン時の書き込みでロールバックした場合は,ERRTRNRを起動します。
また,DBキューグループを指定してee_dbq_msgput関数を発行した場合も同様にロールバックすることがあります。通番が最大書き込みメッセージ数に達したDBキューがある場合に,DBキューグループを指定したee_dbq_msgput関数を発行するときは,eedbqisltコマンドで該当のDBキューを縮退させてください。これによって,通番が最大書き込みメッセージ数に達したDBキューを,DBキューグループを指定したee_dbq_msgput関数によるメッセージの書き込みの対象外にできます。
- 注意事項
-
-
上書き抑止属性を設定したDBキューを再利用する場合は,DBキューの通番を初期化してください。DBキューの通番の初期化については,「(2) DBキューの通番の初期化」を参照してください。
-
上書き抑止属性を設定したDBキューに書き込むのは,バージョンが07-80以降のTP1/EEにしてください。07-80より前のTP1/EEで書き込んだ場合は上書きを抑止できません。
-
- 上書き抑止属性を設定しない場合の動作(eedbqtblhコマンドの-aオプションに0または2を指定)
-
通番が最大書き込みメッセージ数に達すると,次のメッセージに設定される通番は1に戻り,読み出し済みの古いメッセージを上書きします。ただし,古いメッセージが未読み出しメッセージのときは,上書きをしないで,メッセージの書き込み要求をしたトランザクションをロールバックします。サービス関数のリターン時の書き込みでロールバックした場合は,ERRTRNRを起動します。
(2) DBキューの通番の初期化
DBキューの通番は,DBキュー表の作成時に初期化されます。この初期化以降に,TP1/EEの正常終了や正常開始などを契機としてDBキューの通番が自動的に初期化されることはありません。業務日付の更新など,業務の区切りで通番を初期化したい場合は,コマンドの実行または関数の発行によって,手動で項番を初期化してください。ただし,通番を初期化すると,DBキューに残っている未読み出しメッセージはすべて破棄されます。
通番を初期化するコマンドまたは関数を使用するには,次の条件をすべて満たしている必要があります。
-
DBキューから読み出すTP1/EEのバージョンが07-80以降である(Cosminexus Reliable Messagingを使用していない)。
-
eedbqtblhコマンドでDBキューを作成するときに,-aオプションに2または3を指定して通番初期化属性を設定している。
-
通番を初期化するDBキューが,dbqgrpdef定義コマンドの-kオプションに1を指定したDBキューグループに属している。
通番の初期化は,通番の初期化を要求したトランザクションがコミットすると有効になります。そのため,トランザクションがロールバックした場合,通番は初期化されません。
なお,通番の初期化には,読み出し停止状態のDBキューを対象とした初期化と,データベースがHiRDBの場合にDBキューやTP1/EEの状態に関係なく初期化できる強制初期化があります。
(a) 読み出し停止状態のDBキューの通番の初期化
TP1/EEがオンライン状態の場合,読み出し停止状態のDBキューの通番はeedbqclrコマンドまたはee_dbq_clear関数によって初期化できます。
ただし,次の条件をすべて満たしている必要があります。
-
通番を初期化するDBキューから読み出すTP1/EEがeedbqclrコマンドを実行,またはee_dbq_clear関数を発行する。
-
他スレッドで,メッセージの読み出し,スキップ,または初期化を実行していない。
-
通番を初期化するDBキューが読み出し停止状態である。
-
通番を初期化するDBキューが書き込み抑止状態※である。
- 注※
-
ee_dbq_clear関数が正常リターンしてからトランザクションが決着する前に書き込み抑止状態を解除すると,ee_dbq_clear関数を発行したトランザクションがロールバックします。
読み出し停止中のDBキューの初期化と次に示す関数またはコマンドが競合すると,競合する関数またはコマンドがエラーリターン(タイミングエラー)することがあります。
-
ee_dbq_msgget関数
-
ee_dbq_msgrefer関数
-
ee_dbq_msgrefer2関数
-
ee_dbq_inquire関数
-
ee_dbq_inquire2関数
-
eedbqlsコマンド
-
eedbqlsdqコマンド
(b) 通番の強制初期化
データベースにHiRDBを使用している場合,DBキューやTP1/EEの状態に関係なく,強制的にDBキューの通番を初期化できます。強制的なDBキューの通番の初期化には,eedbqclrhコマンドを実行します。また,ee_dbq_clear関数を発行することでも,DBキューの状態に関係なく強制的に通番を初期化できます。
強制初期化と次のトランザクションが競合した場合,競合するトランザクションがロールバックすることがあります。
-
DBキューからメッセージを読み出し中のトランザクション
-
DBキューのメッセージをスキップ中のトランザクション
また,強制初期化と次に示す関数またはコマンドが競合すると,競合する関数またはコマンドがエラーリターン(タイミングエラー)することがあります。
-
ee_dbq_msgget関数
-
ee_dbq_msgrefer関数
-
ee_dbq_msgrefer2関数
-
ee_dbq_inquire関数
-
ee_dbq_inquire2関数
-
eedbqlsコマンド
-
eedbqlsdqコマンド
(3) 注意事項
-
ee_dbq_clear関数を発行したトランザクションで通番の初期化を実行中のDBキューに対して,DBキュー関連の関数を発行した場合の動作を次の表に示します。
項番
関数名
通番の初期化を実行中のDBキューに対して発行した場合の動作
1
ee_dbq_acsctl
通番の初期化とは互いに影響しません。
2
ee_dbq_conctl
3
ee_dbq_inqsrv
4
ee_dbq_inquire
関数を発行した順番に関係なく,初期化前の通番を参照します。
5
ee_dbq_inquire2
6
ee_dbq_msgget
先に発行した関数が有効になります。あとから発行した関数は,エラーリターン(タイミングエラー)します。ただし,ee_dbq_msgget関数のあとに強制初期化を実行した場合は,強制初期化が有効になります。
7
ee_dbq_msgput
関数を発行した順番に関係なく,先に通番が初期化されます。書き込み要求されたメッセージには,1から順番に通番が設定されます。ee_dbq_clear関数は,同一トランザクション内で先に発行された書き込み要求を取り消すことはできません。
8
ee_dbq_msgrefer
関数を発行した順番に関係なく,初期化前の通番でメッセージを読み出します。
9
ee_dbq_msgrefer2
10
ee_dbq_rbskip
通番の初期化とは互いに影響しません。トランザクションがコミットした場合は,通番が初期化されます。ロールバックした場合は,サービス開始時にサービス関数に渡したDBキューから読み出したメッセージを読み出し済みにします。
11
ee_dbq_skip
関数を発行した順番に関係なく,通番が初期化されます。
12
ee_dbq_srvctl
通番の初期化とは互いに影響しません。
-
ee_dbq_clear関数の発行,またはeedbqclrコマンド,もしくはeedbqclrhコマンドを実行したトランザクションとは別のトランザクションで通番の初期化を実行中のDBキューに対して,DBキュー関連の関数を発行した場合の動作を次の表に示します。
項番
関数名
通番の初期化を実行中のDBキューに対して発行した場合の動作
1
ee_dbq_acsctl
通番の初期化とは互いに影響しません。
2
ee_dbq_conctl
3
ee_dbq_inqsrv
4
ee_dbq_inquire
関数がエラーリターン(タイミングエラー)することがあります。
5
ee_dbq_inquire2
6
ee_dbq_msgget
関数がエラーリターン(タイミングエラー)するか,関数を発行したトランザクションが同期点処理でロールバックすることがあります。
7
ee_dbq_msgput
同期点処理が行われる順番で決まります。通番の初期化を要求したトランザクションが先に同期点処理された場合,通番の初期化後に書き込み要求されたメッセージには,1から順番に通番が設定されます。
書き込み要求したトランザクションが先に同期点処理された場合は,メッセージ書き込み後に通番を初期化します。書き込んだメッセージは破棄されます。
8
ee_dbq_msgrefer
関数がエラーリターン(タイミングエラー)することがあります。
9
ee_dbq_msgrefer2
10
ee_dbq_rbskip
通番の初期化とは互いに影響しません。
11
ee_dbq_skip
関数がエラーリターン(タイミングエラー)するか,関数を発行したトランザクションが同期点処理でロールバックすることがあります。
12
ee_dbq_srvctl
通番の初期化とは互いに影響しません。