2.19.1 排他オプションの形式と規則
(2) 形式
排他オプション::=〔{WITH{SHARE|EXCLUSIVE}LOCK |WITHOUT LOCK 〔{WAIT|NOWAIT}〕}〕 〔{WITH ROLLBACK|NO WAIT}〕
(3) オペランド
-
〔{WITH{SHARE|EXCLUSIVE}LOCK
|WITHOUT LOCK 〔{WAIT|NOWAIT}〕}〕
このオペランドを省略すると,WITH SHARE LOCKが仮定されます。
ただし,カーソル宣言,又は動的SELECT文でFOR UPDATE句を指定した場合,又はそのカーソルを使用した行の更新,削除をする場合,WITH EXCLUSIVE LOCKが仮定されます。
- WITH SHARE LOCK
-
一度検索したデータの内容を,トランザクション終了までほかのユーザが参照することは許すが,更新することは許さない(共用モード)場合に指定します。
- WITH EXCLUSIVE LOCK
-
一度検索したデータの内容を,トランザクション終了までほかのユーザが参照する(WITHOUT LOCK NOWAITによる参照は除く)ことも,更新することも許さない(排他モード)場合に指定します。
WITH EXCLUSIVE LOCKを指定した場合,問合せ指定のFROM句に指定した表に対してだけ有効です。
WITH EXCLUSIVE LOCKを指定しても,インデクスのキー値には,共用モードの排他を参照時だけにかけ,参照終了時に排他を解除するので,ほかのユーザは同じインデクスを使用できます。ただし,検索に用いているインデクスをほかのユーザが更新している場合,待ちが生じることがあります。トランザクションが終了するまでほかのユーザの処理を待たせるためには,LOCK文を使用します。
- WITHOUT LOCK WAIT
-
一度検索したデータの内容を,トランザクション終了まで排他制御する必要がない場合に指定します。WITHOUT LOCK 〔WAIT〕を指定したSQL文の検索では,参照済みの排他資源(行又はページ)の排他は解除されます。
WITHOUT LOCK 〔WAIT〕を指定すると,トランザクションの終了を待たないで行の検索処理完了を契機に排他を解除するので,排他資源を小さくできます。また,同時実行性も向上します。ただし,同じトランザクション内で同じ行を2度検索しても同じデータを受け取れない場合があるので注意してください。
- WITHOUT LOCK NOWAIT
-
ほかのユーザが更新中(又は排他オプションを指定中)のデータでも更新の完了(又はトランザクションの終了)を待たないで参照し,一度検索したデータの内容をトランザクション終了まで排他制御する必要がない場合に指定します。ただし,検索対象表が共用表であり,ほかのユーザによって排他モードでLOCK文が実行されている場合は,排他解除待ちとなり参照できません。
また,論理ファイルを参照する場合を除き,WITHOUT LOCK NOWAITを指定したSQL文の検索では,ほかのトランザクションが表や行にEXモードで排他を掛けているときでも,排他なしと同じ状態として参照できます。
WITHOUT LOCK NOWAITを指定した場合,同じトランザクション内で同じ行を2度検索しても同じデータを受け取れない場合があるので注意してください。さらに,更新したユーザがそのトランザクションを取り消すと,更新中の表を検索したときにデータベースにないデータを受け取ったことになるので注意してください。
カーソル宣言中,又は動的SELECT文中でWITHOUT LOCK NOWAITを指定する場合,そのカーソル宣言,又は動的SELECT文でFOR UPDATE句は指定できません。また,そのカーソルを使用したUPDATE,又はDELETEも実行できません。
このオペランドを省略すると,検索するデータがほかのユーザによって使用されているとき,その使用中のユーザのトランザクションが終了するまで待ち状態(WITHOUT LOCK NOWAITを除く)になります。
- WITH ROLLBACK
-
検索の対象になるデータがほかのユーザに使用されているとき,トランザクションを取り消して無効にする場合に指定します(エラーとなったSQLより前に実行したSQLは,ロールバックされます)。
- NO WAIT
-
検索の対象になるデータがほかのユーザに使用されているとき,検索をエラー(排他エラー)とし,トランザクションを取り消さない場合に指定します(エラーとなったSQLより前に実行したSQLはロールバックされません)。
この場合,指定したSQLで掛けた排他は解除されません。カーソルは閉じられないので,UAP中でCLOSE文を実行してカーソルを閉じてください。
ただし,次に示す箇所で排他エラーが発生した場合,NO WAITを指定した場合でも,トランザクションを取り消して,無効にします。
-
副問合せで検索の対象になる表
-
FROM句の導出表で検索の対象になる表
-
GROUP BY句に値式を指定した問合せで,検索の対象となる表
-
「内部導出表」となる条件のうちの,どれかを満たす問合せで,検索の対象になる表
内部導出表については,「内部導出表」を参照してください。
-
(4) 留意事項
-
WITHOUT LOCK NOWAITとWITHOUT LOCK NO WAITとでは,意味が異なるので指定を誤らないように注意してください。
(5) 指定例(SELECT文中で排他オプションを指定した場合)
SELECT SCODE FROM ZAIKO WHERE SNAME = N'ブラウス' WITH SHARE LOCK WITH ROLLBACK