Hitachi

ノンストップデータベース HiRDB Version 10 UAP開発ガイド


3.5.3 カーソル宣言と排他の関係

FETCHを実行するとき,又は1行SELECT文を実行するときの排他制御モードはカーソル宣言時,動的SELECT文,又は1行SELECT文の前処理時の排他オプションが優先されます。排他オプションの指定がない場合は,データ保証レベル(データ保証レベル指定がない場合は2を仮定)に従います。データ保証レベルは,システム定義のpd_isolation_levelオペランド,クライアント環境定義のPDISLLVL,又は手続き定義時若しくはトリガ定義時に指定するSQLコンパイルオプションのISOLATION LEVELで指定します。このとき,カーソルを使用した更新(又は削除)の有無,FOR UPDATE時のWITH EXCLUSIVE LOCK仮定によっても影響を受けます。

FOR UPDATE時のWITH EXCLUSIVE LOCK仮定の指定は,クライアント環境定義のPDFORUPDATEEXLOCK,手続き定義時又はトリガ定義時のSQLコンパイルオプションのデータ保証レベル(FOR UPDATE EXCLUSIVEを指定)で行います。

カーソル宣言時(DECLARE CURSOR)の排他オプション,カーソル宣言(DECLARE CURSOR)やカーソル割当て(ALLOCATE CURSOR)に指定した動的SELECT文の排他オプション,又は1行SELECT文に指定した排他オプションによって,実行時の排他制御モードが異なります。カーソル宣言時,又は動的SELECT文前処理時の排他オプションと表操作時の排他オプションの関係を次の表に示します。

なお,カーソル宣言時の排他オプションについては,マニュアル「HiRDB SQLリファレンス」を参照してください。

表3‒29 カーソル宣言時,又は動的SELECT文前処理時の排他オプションと主問合せの表操作時の排他オプションの関係

主問合せの表へのLOCK文指定

SQL文中の排他オプション

カーソルを使用した更新許可

FOR UPDATE時のWITH EXCLUSIVE LOCK仮定

データ保証レベル

主問合せの表操作時の排他オプション

あり

EXCLUSIVE

あり

WITH EXCLUSIVE LOCK

WITH EXCLUSIVE LOCK

WITH SHARE LOCK

WITH EXCLUSIVE LOCK

WITHOUT LOCK WAIT

WITH EXCLUSIVE LOCK

WITHOUT LOCK NOWAIT

あり

エラー(KFPA11156-E)

なし

WITH EXCLUSIVE LOCK

なし

WITH EXCLUSIVE LOCK

SHARE

あり

WITH EXCLUSIVE LOCK

WITH EXCLUSIVE LOCK

WITH SHARE LOCK

WITH SHARE LOCK

WITHOUT LOCK WAIT

WITH SHARE LOCK

WITHOUT LOCK NOWAIT

あり

エラー(KFPA11156-E)

なし

WITH SHARE LOCK

なし

あり

あり

WITH EXCLUSIVE LOCK

なし

2

WITH EXCLUSIVE LOCK

1

WITH SHARE LOCK

0

WITH SHARE LOCK

なし

WITH SHARE LOCK

なし

あり

WITH EXCLUSIVE LOCK

WITH EXCLUSIVE LOCK

WITH SHARE LOCK

WITH SHARE LOCK

WITHOUT LOCK WAIT

WITHOUT LOCK WAIT

WITHOUT LOCK NOWAIT

あり

エラー(KFPA11156-E)

なし

WITHOUT LOCK NOWAIT

なし

あり

あり

WITH EXCLUSIVE LOCK

なし

2

WITH EXCLUSIVE LOCK

1

WITHOUT LOCK WAIT

0

WITHOUT LOCK WAIT

なし

2

WITH SHARE LOCK

1

WITHOUT LOCK WAIT

0

WITHOUT LOCK NOWAIT

(凡例)

−:指定内容に関係なく他の項目の指定が優先されます。

指定した排他オプションによって,実行時に次に示すような現象が発生する場合があります。

  • WITH SHARE LOCKを指定した場合

    更新するときに表中の行を共用モードから排他モードにするため,デッドロックになることがあります。

  • WITHOUT LOCK WAITを指定した場合

    ほかのトランザクションによっては,不正更新(二重更新)や削除エラーになることがあります。

  • WITHOUT LOCK NOWAITを指定した場合

    WITHOUT LOCK NOWAITを指定して検索した表に対して更新するSQL文があるとエラーになります。

注※

次の場合,カーソルを使用した更新許可ありとなり,FOR UPDATE句が仮定されます。

  • FOR UPDATE句を指定した場合

  • FOR UPDATE句を指定しないで,同一カーソル(カーソル宣言で指定したカーソル)を指定したUPDATE文,又はDELETE文がある場合

次の場合,カーソルを使用した更新許可なしとなります。

  • FOR UPDATE句を指定しないで,同一カーソル(カーソル宣言で指定したカーソル)を指定したUPDATE文,又はDELETE文もない場合

表3‒30 カーソル宣言時,又は動的SELECT文前処理時の排他オプションと副問合せの表操作時の排他オプションの関係

副問合せの表へのLOCK文指定

SQL文中の排他オプション※1

カーソルを使用した更新許可※2

FOR UPDATE時のWITH EXCLUSIVE LOCK仮定

データ保証レベル

副問合せの表操作時の排他オプション

あり

EXCLUSIVE

あり

WITH EXCLUSIVE LOCK

WITH EXCLUSIVE LOCK

WITH SHARE LOCK

WITH EXCLUSIVE LOCK

WITHOUT LOCK WAIT

WITH EXCLUSIVE LOCK

WITHOUT LOCK NOWAIT

あり

エラー(KFPA11156-E)

なし

WITH EXCLUSIVE LOCK

なし

WITH EXCLUSIVE LOCK

SHARE

あり

WITH EXCLUSIVE LOCK

WITH SHARE LOCK

WITH SHARE LOCK

WITH SHARE LOCK

WITHOUT LOCK WAIT

WITH SHARE LOCK

WITHOUT LOCK NOWAIT

あり

エラー(KFPA11156-E)

なし

WITH SHARE LOCK

なし

あり

あり

WITH SHARE LOCK

なし

2

WITH SHARE LOCK

1

WITH SHARE LOCK

0

WITH SHARE LOCK

なし

WITH SHARE LOCK

なし

あり

WITH EXCLUSIVE LOCK

WITH SHARE LOCK

WITH SHARE LOCK

WITH SHARE LOCK

WITHOUT LOCK WAIT

WITHOUT LOCK WAIT

WITHOUT LOCK NOWAIT

あり

エラー(KFPA11156-E)

なし

WITHOUT LOCK NOWAIT

なし

あり

あり

WITH SHARE LOCK

なし

2

WITH SHARE LOCK

1

WITHOUT LOCK WAIT

0

WITHOUT LOCK WAIT

なし

2

WITH SHARE LOCK

1

WITHOUT LOCK WAIT

0

WITHOUT LOCK NOWAIT

(凡例)

−:指定内容に関係なく他の項目の指定が優先されます。

指定した排他オプションによって,実行時に次に示すような現象が発生する場合があります。

  • WITH SHARE LOCKを指定した場合

    更新するときに表中の行を共用モードから排他モードにするため,デッドロックになることがあります。

  • WITHOUT LOCK WAITを指定した場合

    ほかのトランザクションによっては,不正更新(二重更新)や削除エラーになることがあります。

  • WITHOUT LOCK NOWAITを指定した場合

    WITHOUT LOCK NOWAITを指定して検索した表に対して更新するSQL文があるとエラーになります。

注※1

主問合せに指定したSQL文中の排他オプションを示します(副問合せに排他オプションは指定できません)。

注※2

次の場合,カーソルを使用した更新許可ありとなり,FOR UPDATE句が仮定されます。

  • 主問合せにFOR UPDATE句を指定した場合(副問合せにFOR UPDATE句は指定できません)

  • 主問合せにFOR UPDATE句を指定しないで,同一カーソル(カーソル宣言で指定したカーソル)を指定したUPDATE文,又はDELETE文がある場合

次の場合,カーソルを使用した更新許可なしとなります。

  • 主問合せにFOR UPDATE句を指定しないで,同一カーソル(カーソル宣言で指定したカーソル)を指定したUPDATE文,又はDELETE文もない場合

HiRDBでは,FETCH文で検索対象となる行を先読みする場合があります。先読みした行には排他を取得するため,FETCH文を発行して取得している行数以上に排他を取得します。このため,検索対象となる行数ではなく,FETCH文で取得する行数で排他資源数を見積もると,排他制御のためのバッファが不足する場合があります。カーソルを使用した操作をする場合は,検索対象となる行数で排他資源数を見積もってください。排他資源数を抑えるためには,探索条件で対象となる行を絞り込む必要があります。対象となる行を絞り込むことができない場合は,排他の単位を変更するなど排他制御の抑止を検討する必要があります。排他制御の抑止については,「UAPでできる排他制御」を参照してください。