Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 TP1/Server Base Enterprise Option 使用の手引


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キューを対象とした初期化と,データベースが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) 注意事項