2.9.5 排他自動解除機能を使用したレコードの検索例
排他自動解除機能を使用したレコードの検索例を次に示します。
-
排他自動解除機能を使用して,4V FMBまたはSD FMBのSDBデータベースを階層順に検索する場合の例は,「2.9.5(1)例1 排他自動解除機能を使用する場合のSDBデータベースの階層順検索【4V FMB,SD FMB】」を参照してください。
また,排他自動解除機能を使用しない場合の例については,「2.9.5(2)例2 排他自動解除機能を使用しない場合のSDBデータベースの階層順検索【4V FMB,SD FMB】」を参照してください。
- 参考
-
例1は,4V FMBのSDBデータベースの場合は,SDBデータベースを操作するAPIの排他モード1に'S'(共用モード)を指定したときの検索例です。SD FMBのSDBデータベースの場合は,FOR UPDATEオペランドの指定を省略したときの検索例です。
-
排他自動解除機能を使用して各APIまたはDMLを実行したあと,別のルートレコードのレコード実現値を検索してレコード位置指示子が移動する場合の例については,次の項目を参照してください。
-
排他自動解除機能を使用して複数レコードの検索(FETCHDB ALL)を実行した場合の例については,「2.9.5(8)例8 排他自動解除機能を使用して複数レコードの検索(FETCHDB ALL)を実行する場合の動作【4V FMB】」を参照してください。
4V AFMのSDBデータベースでも仮想ルートレコードのレコード実現値を操作して検索するため,基本的には4V FMBのSDBデータベースの例と同様の動作となります。
なお,上記の例の中で使用している記号の凡例については,「2.9.5(1)例1 排他自動解除機能を使用する場合のSDBデータベースの階層順検索【4V FMB,SD FMB】」の1.にある図の凡例を参照してください。
- 〈この項の構成〉
(1) 例1 排他自動解除機能を使用する場合のSDBデータベースの階層順検索【4V FMB,SD FMB】
-
ルートレコードのレコード実現値A,2階層目のレコード実現値A1,および3階層目のレコード実現値A1-1の順にレコードを検索(FETCH)します。
これによって,検索したレコード実現値が格納されているデータページP1,P2,およびP3に排他(SRモード)が掛かります。
-
3階層目のレコード実現値A1-2を検索(FETCH)します。
この場合,レコード位置指示子R3が指すレコード実現値は,A1-1からA1-2となりますが,これらのレコード実現値は同一データページに格納されているため,データページP3は排他(SRモード)が掛かった状態のままです。
-
3階層目のレコード実現値A1-3を検索(FETCH)します。
この場合,レコード位置指示子R3が指すレコード実現値は,A1-2からA1-3となります。これらのレコード実現値は異なるデータページに格納されているため,データページP6に排他(SRモード)が掛かり,データページP3の排他(SRモード)は解除されます。
-
2階層目のレコードA2を検索(FETCH)します。
この場合,レコード位置指示子R2が指すレコード実現値はA1からA2となります。これらのレコード実現値は異なるデータページに格納されているため,データページP8に排他(SRモード)が掛かり,データページP2の排他(SRモード)は解除されます。同時に,レコード位置指示子R3が空値となるため,3階層目のレコード実現値A1-3が格納されているデータページP6の排他(SRモード)も解除されます。
-
3階層目のレコード実現値A2-1を検索(FETCH)します。
この場合,レコード位置指示子R3がレコード実現値A2-1を指すので,レコード実現値A2-1が格納されているデータページP9に排他(SRモード)が掛かります。
-
ルートレコードのレコード実現値Bを検索(FETCH)します。
この場合,レコード位置指示子R1が指すレコード実現値はAからBとなるので,データページP10に排他(SRモード)が掛かり,データページP1の排他(SRモード)は解除されます。同時に,レコード位置指示子R2およびR3が空値となるので,それまでレコード位置指示子が指していたレコード実現値を格納しているデータページP8およびP9の排他(SRモード)も解除されます。
(2) 例2 排他自動解除機能を使用しない場合のSDBデータベースの階層順検索【4V FMB,SD FMB】
排他自動解除機能を使用しないで「2.9.5(1)例1 排他自動解除機能を使用する場合のSDBデータベースの階層順検索【4V FMB,SD FMB】」の1.〜6.で示した検索(FETCH)を実行すると,一度検索したレコード実現値を格納しているデータページP1,P2,P3,P6,P8,およびP9の排他(SRモード)は解除されないで,トランザクションが終了するまで保持されます。
(3) 例3 排他自動解除機能を使用してレコードの格納(STORE)を実行する場合の動作【4V FMB,SD FMB】
-
次の順序でSDBデータベースを操作するAPIまたはDMLを実行します。
a. ルートレコードのレコード実現値Aを検索(FETCH)します。
b. 2階層目のレコード実現値A1を検索(FETCH)します。
c. 3階層目のレコード実現値A1-1を検索(FETCH)します。
d. 4階層目のレコード実現値A1-1-3を格納(STORE)します。
APIまたはDMLを実行すると,次の図のように排他が掛かります。
-
ルートレコードのレコード実現値Bを検索(FETCH)します。
この場合,ルートレコードのレコード実現値Bが格納されているデータページP5に排他(PUモード)が掛かり,ルートレコードのレコード実現値Aが格納されているデータページP1を除き,更新されていないデータページP2の排他(PUモード)だけが解除されます。なお,データページP3,P4,P12については,レコード間ポインタなどの制御情報が更新されるため,排他が掛かった状態のままとなります。
(4) 例4 排他自動解除機能を使用してレコードの更新(MODIFY)を実行する場合の動作【4V FMB,SD FMB】
-
次の順序でSDBデータベースを操作するAPIまたはDMLを実行します。
a. ルートレコードのレコード実現値Aを検索(FETCH)します。
b. 2階層目のレコード実現値A1を検索(FETCH)します。
c. 3階層目のレコード実現値A1-1を検索(FETCH)します。
d. 3階層目のレコード実現値A1-1を更新(MODIFY)します。
APIまたはDMLを実行すると,次の図のように排他が掛かります。
-
ルートレコードのレコード実現値Bを検索(FETCH)します。
この場合,ルートレコードのレコード実現値Bが格納されているデータページP4に排他(PUモード)が掛かり,ルートレコードのレコード実現値Aが格納されているデータページP1を除き,更新されていないデータページP2の排他(PUモード)だけが解除されます。
(5) 例5 排他自動解除機能を使用してレコードの削除(ERASE)を実行する場合の動作【4V FMB,SD FMB】
-
次の順序でSDBデータベースを操作するAPIまたはDMLを実行します。
a. ルートレコードのレコード実現値Aを検索(FETCH)します。
b. 2階層目のレコード実現値A1を検索(FETCH)します。
c. 3階層目のレコード実現値A1-1を検索(FETCH)します。
d. 4階層目のレコード実現値A1-1-2を検索(FETCH)します。
e. 4階層目のレコード実現値A1-1-2を削除(ERASE)します(位置づけしたレコード実現値(その配下の子レコード実現値も含む)を削除します)。
APIまたはDMLを実行すると,次の図のように排他が掛かります。
-
ルートレコードのレコード実現値Bを検索(FETCH)します。
この場合,ルートレコードのレコード実現値Bが格納されているデータページP6に排他(PU)が掛かり,ルートレコードのレコード実現値Aが格納されているデータページP1と削除対象のレコード実現値A1-1-2の親レコード実現値A1-1が格納されているデータページP3を除いて,更新されていないデータページP2の排他(PUモード)だけが解除されます。なお,データページP4,P14については,レコード間ポインタの制御情報が変更されるため,排他が掛かった状態のままとなります。
(6) 例6 排他自動解除機能を使用して一括削除を実行する場合の動作【4V DAM,4V SAM】
-
仮想ルートレコードのレコード実現値A下のすべてのレコード実現値に対して一括削除を実行します。
一括削除の結果,仮想ルートレコードのレコード実現値Aが格納されているデータページP1に排他(EXモード)が掛かります。
-
2階層目のレコード実現値B1-1を検索(FETCH)します。
この場合,仮想ルートレコードのレコード実現値Bが格納されているデータページP5,2階層目のレコード実現値B1-1が格納されているデータページP6にそれぞれ排他(SRモード,PUモード)が掛かりますが,排他確保済みページの中で更新されていないページは存在しないため,排他は解除されません。
(7) 例7 構成情報取得を実行する場合の動作【4V AFM】
構成情報取得については,排他自動解除機能を適用しない場合の動作がこれまでのAPIと異なります。
-
仮想ルートレコードのレコード実現値AおよびB下のレコード実現値の構成情報取得を実行します。
この場合,仮想ルートレコードのレコード実現値AからBの順に操作しますが,排他自動解除機能の適用有無に関係なく,排他自動解除機能が適用された場合の動作となります。
-
APIが終了したときには,最後に操作した仮想ルートレコードのレコード実現値Bが格納されているデータページP3の排他(SRモード)も解除されます。
(8) 例8 排他自動解除機能を使用して複数レコードの検索(FETCHDB ALL)を実行する場合の動作【4V FMB】
-
指示コードに'F'を指定して,複数レコードの検索(FETCHDB ALL)を実行することで,ルートレコードのレコード実現値A,2階層目のレコード実現値A1,および3階層目のレコード実現値A1-1を検索します。
複数レコードの検索では,ルートレコード実現値が格納されているデータページ以外のページに排他を掛けないため,データページP1にだけ排他(SRモード)が掛かります。
-
指示コードに'N'を指定して,複数レコードの検索(FETCHDB ALL)を実行することで,4階層目のレコード実現値A1-1-1,A1-1-2,A1-1-3を検索します。
この場合,ファミリの移動はないため,データページP1にだけ排他(SRモード)が掛かった状態のままとなります。
-
指示コードに'N'を指定して,複数レコードの検索(FETCHDB ALL)でルートレコードのレコード実現値B,2階層目のレコード実現値B1,および3階層目のレコード実現値B1-1を検索します。
この場合,ファミリが移動したため,ルートレコード実現値Bが格納されているデータページP5にだけ排他(SRモード)が掛かり,データページP1の排他は解除されます。
-
指示コードに'N'を指定して,複数レコードの検索(FETCHDB ALL)でルートレコードのレコード実現値C,2階層目のレコード実現値C1,および3階層目のレコード実現値C1-1を検索します。
ファミリが移動したため,ルートレコード実現値Cが格納されているデータページP9にだけ排他(SRモード)が掛かり,データページP5の排他は解除されます。
なお,排他自動解除機能を使用しないで1.から4.に示した検索を実行すると,一度検索したルートレコード実現値を格納しているデータページP1,P5およびP9の排他(SRモード)は解除されないで,トランザクション終了まで保持されます。
(9) 排他自動解除機能の使用時に排他が解除されないケース
- ■4V FMBまたは4V AFMのSDBデータベースの場合
-
次に示す場合は,排他自動解除機能を使用したときでも,データの完全性を保証するために排他解除の対象外となります。
-
更新したレコード実現値が格納されている場合(SDBデータベースを操作するAPIの排他モード1に'E'(排他モード)または'O'(占有モード)を指定して,検索しただけのレコード実現値が格納されているページは排他解除の対象となります)
-
レコード実現値が1つでも更新されているファミリのルートレコードのレコード実現値が格納されている場合
なお,4V FMBのSDBデータベースで,USERポインタが設定されていない中間レコード(FIRSTポインタ,LASTポインタのどちらからも指されていないレコード実現値)を削除する場合,削除対象となるレコード実現値の親レコード実現値は更新されませんが,例外的に排他は解除されません。
-
- ■SD FMBのSDBデータベースの場合
-
次に示す場合は,排他自動解除機能を使用したときでも,データの完全性を保証するために排他解除の対象外となります。
-
更新したレコード実現値が格納されている場合(FOR UPDATEオペランドを指定して,検索しただけのレコード実現値が格納されているページは排他解除の対象となります)
-
レコード実現値が1つでも更新されているファミリのルートレコードのレコード実現値が格納されている場合
なお,中間レコード(FIRSTポインタ,LASTポインタのどちらからも指されていないレコード実現値)を削除する場合,削除対象となるレコード実現値の親レコード実現値は更新されませんが,例外的に排他は解除されません。
-