ページの先頭行へ戻る
Symfoware Server V12.1.x アプリケーション開発ガイド(共通編)
FUJITSU Software

1.1.12 PRECEDENCE(1)を指定したSEQUENTIAL構造の特徴と注意事項

DSO定義でPRECEDENCE(1)を指定し、コミットデータ即時読込み機能を利用するSEQUENTIAL構造の表は、トランザクションの特性や排他の指定方法が他の格納構造の表と異なります。以下のような点に注意して利用してください。

1.1.12.1 トランザクションの特性

PRECEDENCE(1)が指定されたSEQUENTIAL構造の表にアクセスするトランザクションで、排他の単位に行を指定し、独立性水準にREAD COMMITTEDを指定した場合のアプリケーションの振る舞いや競合時の動作は、以下のようになります。

READ COMMITTED指定時の振る舞い

PRECEDENCE(1)が指定されていないSEQUENTIAL構造の表にアクセスするあるトランザクションが更新した行を、READ COMMITTEDを指定したトランザクションで検索すると、検索トランザクションは排他待ちになります。

しかし、PRECEDENCE(1)が指定されたSEQUENTIAL構造の表に対して以下のSQL文を実行した場合、検索する行が更新途中であっても、排他待ちすることなく、更新が発生する前のコミット済みのデータを検索することができます。そのため、更新業務と並行して1つの表に対して高頻度で検索するような業務に適しています。

上記SQL文は各行の読み込み時の最新のコミット済みデータを参照します。このため、上記SQL文実行中に更新業務がコミットした場合、以下のような現象が起こることがあります。構築する業務において、この現象が発生すると不都合な場合は、PRECEDENCE(1)が指定されたSEQUENTIAL構造の表を使用しないでください。

PRECEDENCE(1)を指定したSEQUENTIAL構造の表と他の格納構造の表を混在してSQL文に指定した場合、他の格納構造の表のアクセスで排他待ちになる可能性があります。そのため、排他待ちすることなく検索を実行したい場合は、SQL文中にはPRECEDENCE(1)を指定したSEQUENTIAL構造の表のみを指定してください。

また、更新トランザクションを実行する場合、ある行について検索してから更新や削除するまでの区間に、他のトランザクションが更新や削除を行ってコミットする可能性があります。このような場合、データの整合性を保証するために、更新トランザクションについて以下の対処を行ってください。

上記対処を行わないと以下の現象になります。

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の更新結果がすべて反映されます。

1.1.12.2 排他に関する指定

PRECEDENCE(1)が指定されたSEQUENTIAL構造の表にアクセスするアプリケーションにおいて、排他に関する指定が他の格納構造と異なる箇所について説明します。

排他の属性の指定と占有の単位

動作環境ファイルの実行パラメタによる排他の属性の指定において、他の格納構造と異なる点は以下です。

DSO_LOCK:

Pパラメタによるページ単位の占有は指定できません。

R_LOCK:

本パラメタがNOの場合、占有単位はDSIになります。

各パラメタの記述形式については、“2.1.1 動作環境ファイル”を参照してください。

占有モード

SQL文において占有モード指定にFREE LOCKを指定した場合に他の格納構造と異なる点があります。

SQL文における占有モード指定での指定

占有の単位に行を指定し、占有モード指定にFREE LOCKを指定した場合、“占有のしかたと占有期間”および“他のトランザクションとの待ち関係”が、他の格納構造と異なります。

表1.15 占有モード指定と資源の占有(PRECEDENCE(1)を指定した場合)

占有モード指定

占有のしかたと占有期間

他のトランザクションとの
待ち関係

読込み水準

FREE LOCK

資源を占有しない。

当該SQL文を実行しても、他のトランザクションを待たせない。

各行の読込み時の最新のコミット済みデータを読み込む。当該SQL文で読み込んだ行は、他のトランザクションに更新されることがあるため、同一トランザクションで再検索すると最新の結果を検索することができる。

占有モード指定を指定したSQL文の待ち関係

占有の単位に行を指定し、占有モードにFREE LOCKを指定した場合、EXCLUSIVE LOCKとの待ち関係が、他の格納構造と異なります。

表1.16 占有モード指定と待ち関係(PRECEDENCE(1)を指定した場合)

  

  

先行トランザクション

  

占有モード指定

EXCLUSIVE
LOCK

SHARE LOCK

FREE LOCK

NO LOCK

後続トランザクション

EXCLUSIVE LOCK

×

×

FREE LOCK

○:待つことなく動作する

△:FREE LOCKを指定した側SQL文が以下のいずれかの場合は、待つことなく動作する
    ・単一行SELECT文
    ・OPEN文
    いずれも上記以外の場合は、先行トランザクションの終了を待つ

×:先行トランザクションの終了を待つ

カーソル宣言およびSET TRANSACTION文における指定とSQL文の占有モード指定における指定との対応関係

占有の単位に行を指定し、独立性水準がREAD COMMITTED、トランザクションアクセスモードがREAD WRITE、更新可能性句が省略された場合、対応する占有モード指定が他の格納構造と異なります。

排他制御に関するパラメタの相互関係

R_LOCKの値がNOの場合、占有の単位はDSI単位となり、他の格納構造と異なります。

表1.17 排他制御に関するパラメタの相互関係

R_LOCKの値

DSO_LOCK
の指定

SET TRANSACTION文の指定

占有モード指定の指定

占有のふるまい

占有の単位

NO

×

×

独立性水準は、SERIALIZABLEになる

DSI単位

-

占有モード指定での指定に従う

-

SET TRANSACTION文の独立性水準に従う。ただし、独立性水準にREPEATABLE READを指定した場合は、SERIALIZABLEになる

-

占有モード指定での指定に従う

-

独立性水準は、SERIALIZABLEになる

○ : 指定可能

× : 指定できません

- : 指定を省略

1.1.12.3 対象資源が競合した場合の制御

資源の競合が起きた場合に、どのタイミングまで占有待ちとなるのかは、トランザクションモードの指定によって異なります。以下に、トランザクションモードの指定と資源の占有について示します。

なお、以下は占有の単位が行の場合についてです。占有の単位がDSIの場合については、“1.1.8 資源の競合が起きた場合の制御”を参照してください。

表1.18 トランザクションモードの指定と資源の占有

  

先行トランザクション





SERIALIZABLE

REPEATABLE
READ

READ COMMITTED

READ UNCOMMITTED

S
Q
L



S
E
L
E
C
T

I
N
S
E
R
T

U
P
D
A
T
E

D
E
L
E
T
E

S
E
L
E
C
T

I
N
S
E
R
T

U
P
D
A
T
E

D
E
L
E
T
E

S
E
L
E
C
T

I
N
S
E
R
T

U
P
D
A
T
E

D
E
L
E
T
E










独立性水準

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文と同じになります。