スケーラブルデータベースサーバ HiRDB Version 8 UAP開発ガイド

[目次][索引][前へ][次へ]

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

FETCHを実行するとき,又は1行SELECT文を実行するときの排他制御モードはカーソル宣言時,動的SELECT文,又は1行SELECT文の前処理時の排他オプションが優先されます。排他オプションの指定がない場合は,データ保証レベル(データ保証レベル指定がない場合は2を仮定)に従います。データ保証レベルは,クライアント環境定義の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 Version 8 SQLリファレンス」を参照してください。

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

SQL文中の排他オプション FOR UPDATE時のWITH EXCLUSIVE LOCK仮定 データ保証レベル カーソルを使用した更新許可※1 表操作時の排他オプション,及びFOR UPDATE句の仮定値
あり WITH EXCLUSIVE LOCK ※2 ※2 なし WITH EXCLUSIVE LOCK
あり WITH EXCLUSIVE LOCK FOR UPDATE
WITH SHARE LOCK なし WITH SHARE LOCK
あり WITH SHARE LOCK FOR UPDATE
WITHOUT LOCK WAIT なし WITHOUT LOCK WAIT
あり WITHOUT LOCK WAIT FOR UPDATE
WITHOUT LOCK NOWAIT なし WITHOUT LOCK NOWAIT
あり エラー
なし あり 2 なし WITH SHARE LOCK
あり WITH EXCLUSIVE LOCK FOR UPDATE
1 なし WITHOUT LOCK WAIT
あり WITH EXCLUSIVE LOCK FOR UPDATE
0 なし WITHOUT LOCK NOWAIT
あり WITH EXCLUSIVE LOCK FOR UPDATE
なし 2 なし WITH SHARE LOCK
あり WITH EXCLUSIVE LOCK FOR UPDATE
1 なし WITHOUT LOCK WAIT
あり WITHOUT LOCK WAIT FOR UPDATE
0 なし WITHOUT LOCK NOWAIT
あり WITHOUT LOCK WAIT FOR UPDATE

(凡例)
−:該当しません。

指定した排他オプションによって,実行時に次に示すような現象が発生する場合があります。
  • WITH SHARE LOCKを指定した場合
    更新するときに表中の行を共用モードから排他モードにするため,デッドロックになることがあります。
  • WITHOUT LOCK WAITを指定した場合
    ほかのトランザクションによっては,不正更新(二重更新)や削除エラーになることがあります。
  • WITHOUT LOCK NOWAITを指定した場合
    WITHOUT LOCK NOWAITを指定して検索した表に対して更新するSQL文があるとエラーになります。

注※1
次の場合,カーソルを使用した更新許可ありとなります。
  • FOR UPDATE句を指定した場合
  • FOR UPDATE句を指定しないで,同一カーソル(カーソル宣言で指定したカーソル)を指定したUPDATE文,又はDELETE文がある場合
次の場合,カーソルを使用した更新許可なしとなります。
  • FOR UPDATE句を指定しないで,同一カーソル(カーソル宣言で指定したカーソル)を指定したUPDATE文,又はDELETE文もない場合

注※2
指定内容に関係なくSQL文中の排他オプションが優先されます。

 

HiRDBでは,カーソルを開くと,1回目のFETCH文で検索対象のすべての行を読み込むので,排他制御のためのバッファが不足する場合があります。これは,内部的な作業表の作成によってオーバヘッドが増加するからです。したがって,カーソルを使用した操作をする場合,あらかじめ探索条件で対象となる行を絞り込む必要があります。

なお,対象となる行を絞り込むことができない場合は,排他の単位を変更するなど排他制御の抑止を検討する必要があります。排他制御の抑止については,「3.4.8 UAPでできる排他制御」を参照してください。