DSO定義でPRECEDENCE(1)を指定し、コミットデータ即時読込み機能を利用するSEQUENTIAL構造の表は、トランザクションの特性や排他の指定方法が他の格納構造の表と異なります。以下のような点に注意して利用してください。
トランザクションの特性
排他に関する指定
対象資源が競合した場合の制御
PRECEDENCE(1)が指定されたSEQUENTIAL構造の表にアクセスするトランザクションで、排他の単位に行を指定し、独立性水準にREAD COMMITTEDを指定した場合のアプリケーションの振る舞いや競合時の動作は、以下のようになります。
READ COMMITTED指定時の振る舞い
PRECEDENCE(1)が指定されていないSEQUENTIAL構造の表にアクセスするあるトランザクションが更新した行を、READ COMMITTEDを指定したトランザクションで検索すると、検索トランザクションは排他待ちになります。
しかし、PRECEDENCE(1)が指定されたSEQUENTIAL構造の表に対して以下のSQL文を実行した場合、検索する行が更新途中であっても、排他待ちすることなく、更新が発生する前のコミット済みのデータを検索することができます。そのため、更新業務と並行して1つの表に対して高頻度で検索するような業務に適しています。
単一行SELECT文
更新可能性句に、FOR READ ONLYを指定したカーソル、または更新可能性句を省略したカーソルのOPEN文
上記SQL文は各行の読み込み時の最新のコミット済みデータを参照します。このため、上記SQL文実行中に更新業務がコミットした場合、以下のような現象が起こることがあります。構築する業務において、この現象が発生すると不都合な場合は、PRECEDENCE(1)が指定されたSEQUENTIAL構造の表を使用しないでください。
SQL文の検索結果に、ある行については更新業務が更新する前の行、別の行については更新業務が更新した後の行が含まれる場合があります。
SQL文の検索結果に、ある行の更新前後の行がともに含まれる場合や、いずれも含まれない場合があります。
PRECEDENCE(1)を指定したSEQUENTIAL構造の表と他の格納構造の表を混在してSQL文に指定した場合、他の格納構造の表のアクセスで排他待ちになる可能性があります。そのため、排他待ちすることなく検索を実行したい場合は、SQL文中にはPRECEDENCE(1)を指定したSEQUENTIAL構造の表のみを指定してください。
また、更新トランザクションを実行する場合、ある行について検索してから更新や削除するまでの区間に、他のトランザクションが更新や削除を行ってコミットする可能性があります。このような場合、データの整合性を保証するために、更新トランザクションについて以下の対処を行ってください。
カーソルの更新可能性句にFOR UPDATEを指定する。
占有モード指定にSHARE LOCK、またはEXCLUSIVE LOCKを指定する。
上記対処を行わないと以下の現象になります。
他のトランザクションが更新した行を上書きにより更新してしまう場合がある。
他のトランザクションが削除した行についてUPDATE文:位置づけやDELETE文:位置づけを行うと、対象行が存在しないのでエラーになる。
他のトランザクションが削除した行についてUPDATE文:探索やDELETE文:探索を行うと、対象行が存在しないのでデータなしになる。
PRECEDENCE(1)を指定したSEQUENTIAL構造の表にアクセスする場合のREAD COMMITTED指定時の排他処理を以下に示します。
図1.20 PRECEDENCE(1)を指定したSEQUENTIAL構造の表にアクセスする場合のREAD COMMITTED指定時の排他
(1) 利用者AがCOL1>0の行を参照します。このとき、行は占有しません。
(2) 利用者Bは利用者Aが資源を参照中に更新を行うことができます。このとき、資源を占有します。データベースには更新前の行に加え、更新後の行が格納されます。
(3) 利用者Aは利用者Bが行を更新占有中であっても参照を完了させることができます。検索される行には、利用者Bが更新途中の結果は反映されません。
(4) 利用者Bの更新が終了しますが、行の占有は続きます。
(5) 利用者AがCOL1>0の行を参照します。このとき、利用者Bが更新占有中の行であっても参照することができます。
(6) 利用者Bがトランザクションを終了し、行を解放します。
(7) 利用者Aの参照が終了します。参照中に利用者BがCOMMITしたため、検索される行には利用者Bの更新結果が一部反映されます。
(8) 利用者AがCOL1>0の行を参照します。このとき、行は占有しません。
(9) 利用者Aの参照が終了します。このとき、検索される行には利用者Bの更新結果がすべて反映されます。
PRECEDENCE(1)が指定されたSEQUENTIAL構造の表にアクセスするアプリケーションにおいて、排他に関する指定が他の格納構造と異なる箇所について説明します。
排他の属性の指定と占有の単位
動作環境ファイルの実行パラメタによる排他の属性の指定において、他の格納構造と異なる点は以下です。
Pパラメタによるページ単位の占有は指定できません。
本パラメタがNOの場合、占有単位はDSIになります。
各パラメタの記述形式については、“2.1.1 動作環境ファイル”を参照してください。
占有モード
SQL文において占有モード指定にFREE LOCKを指定した場合に他の格納構造と異なる点があります。
占有の単位に行を指定し、占有モード指定にFREE LOCKを指定した場合、“占有のしかたと占有期間”および“他のトランザクションとの待ち関係”が、他の格納構造と異なります。
占有モード指定 | 占有のしかたと占有期間 | 他のトランザクションとの | 読込み水準 |
---|---|---|---|
FREE LOCK | 資源を占有しない。 | 当該SQL文を実行しても、他のトランザクションを待たせない。 | 各行の読込み時の最新のコミット済みデータを読み込む。当該SQL文で読み込んだ行は、他のトランザクションに更新されることがあるため、同一トランザクションで再検索すると最新の結果を検索することができる。 |
占有の単位に行を指定し、占有モードにFREE LOCKを指定した場合、EXCLUSIVE LOCKとの待ち関係が、他の格納構造と異なります。
|
| 先行トランザクション | |||
---|---|---|---|---|---|
| 占有モード指定 | EXCLUSIVE | SHARE LOCK | FREE LOCK | NO LOCK |
後続トランザクション | EXCLUSIVE LOCK | × | × | △ | ○ |
FREE LOCK | △ | ○ | ○ | ○ |
○:待つことなく動作する
△:FREE LOCKを指定した側SQL文が以下のいずれかの場合は、待つことなく動作する
・単一行SELECT文
・OPEN文
いずれも上記以外の場合は、先行トランザクションの終了を待つ
×:先行トランザクションの終了を待つ
カーソル宣言およびSET TRANSACTION文における指定とSQL文の占有モード指定における指定との対応関係
占有の単位に行を指定し、独立性水準がREAD COMMITTED、トランザクションアクセスモードがREAD WRITE、更新可能性句が省略された場合、対応する占有モード指定が他の格納構造と異なります。
占有モード指定を省略したSQL文が、カーソル宣言の場合
SET TRANSACTION文における指定 | カーソル宣言の | 対応する占有モード指定 | |
---|---|---|---|
独立性水準 | トランザクション | ||
READ COMMITTED | READ WRITE | 省略 | FREE LOCK |
排他制御に関するパラメタの相互関係
R_LOCKの値がNOの場合、占有の単位はDSI単位となり、他の格納構造と異なります。
R_LOCKの値 | DSO_LOCK | SET TRANSACTION文の指定 | 占有モード指定の指定 | 占有のふるまい | 占有の単位 |
---|---|---|---|---|---|
NO | ○ | × | × | 独立性水準は、SERIALIZABLEになる | DSI単位 |
- | ○ | ○ | 占有モード指定での指定に従う | ||
- | SET TRANSACTION文の独立性水準に従う。ただし、独立性水準にREPEATABLE READを指定した場合は、SERIALIZABLEになる | ||||
- | ○ | 占有モード指定での指定に従う | |||
- | 独立性水準は、SERIALIZABLEになる |
○ : 指定可能
× : 指定できません
- : 指定を省略
資源の競合が起きた場合に、どのタイミングまで占有待ちとなるのかは、トランザクションモードの指定によって異なります。以下に、トランザクションモードの指定と資源の占有について示します。
なお、以下は占有の単位が行の場合についてです。占有の単位がDSIの場合については、“1.1.8 資源の競合が起きた場合の制御”を参照してください。
| 先行トランザクション | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
独立性水準 | SERIALIZABLE | READ COMMITTED | READ UNCOMMITTED | ||||||||||||
S | S | I | U | D | S | I | U | D | S | I | U | D | |||
後続トランザクション | 独立性水準 | SQL文 |
|
| |||||||||||
REPEATABLE READ | SELECT |
| ○ | × | × | × | ○ | × | × | × | ○ | × | × | × | |
INSERT | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||
UPDATE | × | × | × | × | ○ | × | × | × | ○ | × | × | × | |||
DELETE | × | × | × | × | ○ | × | × | × | ○ | × | × | × | |||
READ COMMITTED | SELECT | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||
INSERT | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||
UPDATE | × | × | × | × | ○ | × | × | × | ○ | × | × | × | |||
DELETE | × | × | × | × | ○ | × | × | × | ○ | × | × | × | |||
READ UNCOMMITTED | SELECT | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||
INSERT | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||
UPDATE | × | × | × | × | ○ | × | × | × | ○ | × | × | × | |||
DELETE | × | × | × | × | ○ | × | × | × | ○ | × | × | × |
○ : 待つことなく動作する
× : トランザクションの終了を待つ
先行または後続のトランザクションがカーソルのOPEN文を実行した場合は、カーソル宣言の更新可能性句の指定によって占有待ちの制御が異なります。
更新可能性句がREAD ONLYの場合、または更新可能性句を省略した場合は、SELECT文と同じになります。更新可能性句がFOR UPDATEの場合は、UPDATE文と同じになります。