ページの先頭行へ戻る
Symfoware Server V12.3.0 データベース簡単運用ガイド
FUJITSU Software

C.7.1 排他の属性と選択方法

排他の属性には、以下のものがあります。

以下に、排他の属性の指定方法と、排他の属性の各項目の概要を説明します。

排他の属性の指定方法

排他の属性を指定するには、以下の方法があります。

占有の資源

占有する対象の資源は、そのアプリケーションで使用する表およびインデックスです。

占有の単位

占有制御によって資源を占有する単位には、行単位、表単位およびインデックス単位があります。

行単位の占有の場合には、アプリケーションがアクセスするデータを含む行が占有の対象になります。このとき、データの参照または更新のための操作対象行も占有の範囲に含まれます。表単位の占有の場合には、アプリケーションがアクセスするデータを含む表が占有の対象になります。占有単位を指定するには動作環境ファイルの実行パラメタR_LOCKを使用してください。

R_LOCKの指定

占有単位

YES

行単位で占有

NO

表またはインデックス単位で占有

占有の範囲

表やインデックスの占有範囲はその資源の検索範囲となります。表の検索範囲は、SQL文の探索条件をインデックスで評価して絞り込んだ部分です。このため、インデックスを使用しない場合は、探索条件の評価結果に関わらず、表の全範囲が占有対象となります。インデックスの検索範囲については、“アプリケーション開発ガイド(共通編)”の“SCANエレメント”の“4) INDEX KEY SCAN”を参照してください。

占有モード

データベースにアクセスする場合の占有モードには、共有モードと非共有モードの2種類があります。

共有モードの場合、ロックされたデータは、ほかのトランザクションからのデータ操作において、参照だけが許され更新操作はできません。一般に、データのロックを獲得中のトランザクションのコミットが行われるまで、ほかのトランザクションのデータの更新操作は、待ち状態となります。非共有モードの場合、ロックされたデータは、ほかのトランザクションでデータ操作することはできません。一般に、データのロックを獲得中のトランザクションのコミットが行われるまで、ほかのトランザクションの実行は、待ち状態となります。

占有モードを指定するには、以下の方法があります。

Symfoware Serverによる選択
データに対する占有

Symfoware Serverは、アクセスするデータに対して、以下に示す条件で、SQL文ごとにデータに対する占有モードを選択します。

表C.2 Symfoware Serverによる占有モードの選択

占有モード

選択条件

共有モード

データを参照する処理の部分の場合

非共有モード

データを更新する処理の部分の場合

データ検索を行う以下のSQL文については、アクセスするデータに対する占有モードは共有モードになります。また、これらのSQL文については、インデックスに対する更新が行われないので、インデックスに対するモードは共有モードになります。

  • OPEN文(ただし、カーソル宣言の更新可能性句にFOR UPDATEを指定したカーソルのOPEN文は、非共有モードで占有します。)

  • 単一行SELECT文

  • FETCH文

データの更新、削除および挿入を行う以下のSQL文については、処理(更新、削除および挿入)対象のデータに対する占有モードは、非共有モードになります。ただし、データ更新、削除および挿入を行うSQL文であっても、UPDATE文やDELETE文の更新対象のデータを位置づけるための検索やINSERT文に指定した問合せ指定の検索に関しては、共有モードになります。

  • UPDATE文:探索

  • UPDATE文:位置づけ

  • DELETE文:探索

  • DELETE文:位置づけ

  • INSERT文

インデックスに対する占有

Symfoware Serverは、SQL文の処理で使用するインデックスの更新の有無により、以下のように選択します。

表C.3 Symfoware Serverによるインデックスに対する占有モードの選択

インデックスに対する占有モード

インデックス更新の有無

共有モード

インデックス更新なし

非共有モード

インデックス更新あり

データ更新を行う以下のSQL文については、更新対象の列に設定されているインデックスに対して更新が行われます。したがって、そのようなインデックスに対する占有モードは非共有モードになります。一方、更新対象でない列に設定されているインデックスに対しては、更新は行われないので、そのようなインデックスに対する占有モードは共有モードになります。

  • UPDATE文:探索

  • UPDATE文:位置づけ

データ削除および挿入を行う以下のSQL文については、更新対象の表に張られているインデックスに対して更新が行われます。したがって、そのようなインデックスに対する占有モードは非共有モードになります。

  • DELETE文:探索

  • DELETE文:位置づけ

  • INSERT文

SET TRANSACTION文での指定

SET TRANSACTION文での指定については、“C.3 トランザクションモード”を参照してください。

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

SQL文に占有モード指定を指定することにより、SQL文が読み込んだ資源(データおよびインデックス)の占有モードと占有期間を柔軟に変更することができます。占有モード指定がある場合、SET TRANSACTION文で指定された内容とは無関係に動作します。占有モード指定と資源の占有について以下に示します。

表C.4 占有モード指定と資源の占有

占有モード指定

占有のしかたと占有期間

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

読込み水準

EXCLUSIVE
LOCK

非共有モードで、トランザクション終了まで資源を占有する。

当該トランザクションが終了するまで、同じ資源を参照/更新する他のトランザクションを待たせる。

COMMIT済みの行を読み込む。当該SQL文で読み込んだ行は、トランザクション終了まで他のトランザクションに更新されることがないため、一度読み込んだ行は、他のトランザクションによって更新されないことが保証される。

SHARE LOCK

共有モードで、トランザクション終了まで資源を占有する。

SQL文の実行後は、当該トランザクションが終了するまで、同じ資源を更新する他のトランザクションを待たせる。

FREE LOCK

(占有単位に行単位を指定した場合)

資源を占有しない。

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

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

FREE LOCK

(占有単位に行単位を指定していない場合)

共有モードで、SQL文終了(カーソルならば、OPEN文終了時)まで資源を占有する。

当該SQL文の実行中は、同じ資源を更新する他のトランザクションを待たせる。当該SQL文の実行が終了すると、同じ資源を更新する他のトランザクションを実行することができる。

NO LOCK

資源を占有しない。

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

他のトランザクションでCOMMITされていない更新中の行を読みことができる。

占有モード指定は、資源を読み込むときのモードです。読み込んだ資源の更新時には、占有モード指定での指定に関係なくEXCLUSIVE LOCKになります。

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

占有モード指定を指定したSQL文が参照した資源に対する待ち関係を以下に示します。

更新した部分に関してはEXCLUSIVE LOCK指定がされたとみなして表を参照してください。

表C.5 占有モード指定と待ち関係

  

  

先行トランザクション

  

占有モード指定

EXCLUSIVE
LOCK

SHARE LOCK

FREE LOCK

占有単位に行単位を指定した場合

FREE LOCK

占有単位に行単位を指定していない場合

NO LOCK

後続トランザクション

EXCLUSIVE LOCK

×

×

○(注)

SHARE LOCK

×

FREE LOCK

占有単位に行単位を指定した場合

○(注)

FREE LOCK

占有単位に行単位を指定していない場合

×

NO LOCK

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

注):FREE LOCK指定側が、更新可能性句にFOR UPDATEを指定したカーソルの場合は、EXCLUSIVE LOCKと同じ動作になります

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

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

図C.11 ○:待つことなく動作する場合

図C.12 △:先行トランザクションのSQL文の終了を待つ場合

図C.13 ×:先行トランザクションの終了を待つ場合

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

SQL文の占有モード指定を省略した場合、独立性水準、トランザクションアクセスモードおよび更新可能性句を組み合わせることによって、占有モード指定を指定したときと同等の資源の占有のしかたを設定できます。以下に、SET TRANSACTION文および更新可能性句での指定と、それに対応する占有モード指定を示します。

占有モード指定があるSQL文と、占有モード指定を省略したSQL文との待ち関係については、以下の表を利用して同等の占有モード指定を確認した後、“表C.5 占有モード指定と待ち関係”を参照してください。

  • 占有モード指定を省略したSQL文がINSERT文、UPDATE文:位置づけおよびDELETE文:位置づけの場合

    SET TRANSACTION文における指定

    対応する占有モード指定

    独立性水準

    トランザクション
    アクセスモード

    SERIALIZABLE
    REPEATABLE READ
    READ COMMITTED
    READ UNCOMMITTED

    READ WRITE

    EXCLUSIVE LOCK

  • 占有モード指定を省略したSQL文がUPDATE文:探索およびDELETE文:探索の場合

    SET TRANSACTION文における指定

    対応する占有モード指定

    独立性水準

    トランザクション
    アクセスモード

    SERIALIZABLE
    REPEATABLE READ
    READ COMMITTED

    READ WRITE

    SHARE LOCK
    (更新対象行を検索するとき)
    EXCLUSIVE LOCK
    (更新対象行を更新するとき)

    READ UNCOMMITTED

    NO LOCK
    (更新対象行を検索するとき)
    EXCLUSIVE LOCK
    (更新対象行を更新するとき)

ただし、クライアント用の動作環境ファイルの実行パラメタUSQL_LOCKにEXを指定した場合は、更新対象行を検索するときから、EXCLUSIVE LOCKで資源を占有します。

  • 占有モード指定を省略したSQL文が、単一行SELECT文の場合

    SET TRANSACTION文における指定

    対応する占有モード指定

    独立性水準

    トランザクション
    アクセスモード

    SERIALIZABLE
    REPEATABLE READ

    READ ONLY
    READ WRITE

    SHARE LOCK

    READ COMMITTED

    READ ONLY
    READ WRITE

    FREE LOCK

    READ UNCOMMITTED

    READ ONLY
    READ WRITE

    NO LOCK


  • 占有モード指定を省略したSQL文が、カーソル宣言の場合

    SET TRANSACTION文における指定

    カーソル宣言の
    更新可能性句

    対応する占有モード指定

    独立性水準

    トランザクション
    アクセスモード

    SERIALIZABLE
    REPEATABLE READ

    READ ONLY

    FOR READ ONLY または
    省略

    SHARE LOCK

    READ WRITE

    FOR UPDATE

    EXCLUSIVE LOCK

    FOR READ ONLY または
    省略

    SHARE LOCK

    READ COMMITTED

    READ ONLY

    FOR READ ONLY または
    省略

    FREE LOCK

    READ WRITE

    FOR UPDATE

    EXCLUSIVE LOCK

    FOR READ ONLY

    FREE LOCK

    省略

    FREE LOCK

    (占有単位を行単位に指定した場合)

    SHARE LOCK

    (占有単位を行単位に指定していない場合)

    READ UNCOMMITTED

    READ ONLY

    FOR READ ONLY または
    省略

    NO LOCK

    READ WRITE

    FOR UPDATE

    EXCLUSIVE LOCK

    FOR READ ONLY または
    省略

    NO LOCK

SQL文単位の排他制御の例

SET TRANSACTION文によりトランザクションモードを変更する場合、一度トランザクションを終了させる必要があります。しかし、SQL文に占有モード指定を指定することにより、トランザクションを終了することなく、SQL文が読み込んだデータベース資源の占有状態を変更することができます。以下に、デッドロック抑止を目的とした占有モード指定の利用例を示します。

EXEC SQL SELECT * FROM  T1                                  …… (1)
          WHERE C1 = :H1
          WITH OPTION LOCK_MODE(EXCLUSIVE LOCK);
EXEC SQL UPDATE T1 …… (2) SET C2 = :H2 WHERE C1 = :H1; EXEC SQL COMMIT WORK; …… (3)

(1) デッドロック抑止を目的として、単一行SELECT文にEXCLUSIVE LOCKを指定します。参照時から資源を非共有モードで占有します。

(2) 単一行SELECT文によって位置づけられた行の列を更新します。

(3) COMMIT文によりトランザクションを終了します。

SQL文での占有モード指定の使用例

アプリケーションを多重実行する場合、更新処理があると非共有モードで資源を占有する必要があります。このため、他のアプリケーションが先に資源を占有している場合、そのアプリケーションのトランザクションが終了するまで、後続のアプリケーションは処理を待たされます。しかし、同一のレコードを同時に更新することがなければ、排他なしで参照し、実際に更新するレコードのみ排他制御を行えばよいので、システム全体の処理スピードを向上できます。

お互い同一のレコードを同時に更新しない場合は、レコード位置づけ処理において他のアプリケーションのトランザクションを待たないように、カーソル宣言の占有モード指定にNO LOCKを指定します。

図C.14 SQL文での占有モード指定

占有待ちの有無

トランザクション間で資源(行、表全体、インデックス全体)に対して競合が発生した場合、その時点で占有待ちに入る(資源が解放されるまで待つ)場合と、アプリケーションに復帰する場合があります。

Symfoware Serverによる選択

占有待ちを行います。

動作環境ファイルの実行パラメタでの選択方法

アプリケーションの動作環境ファイルの実行パラメタISOLATION_WAITで、以下に示すように指定します。

表C.6 動作環境ファイルの実行パラメタでの占有待ちの有無の選択方法

占有待ちの有無

選択方法

占有待ちになる

WAITを指定した場合、または省略した場合

アプリケーションに復帰する

REJECTを指定した場合

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

排他制御に関する各パラメタの指定と、占有の単位および占有のふるまいについて、以下に示します。

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

R_LOCKの値

SET TRANSACTION文の指定

占有モード指定の指定

占有のふるまい

占有の単位

YES

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

行単位

-

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

-

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

-

独立性水準は、REPEATABLE READになる

NO

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

表またはインデックス単位

-

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

-

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

-

独立性水準は、SERIALIZABLEになる

○ : 指定可能

× : 指定できません

- : 指定を省略