トップページ >  Oracle SQL >  FOR UPDATE
初版2007/02/21: 最終更新日2007/02/21
  FOR UPDATE
目次
FOR UPDATE
FOR UPDATE NOWAIT
FOR UPDATE WAIT 秒数
FOR UPDATE OF
ロックの解除
FOR UPDATE
FOR UPDATE句を使用すると検索した行をロックすることが出来ます。
これは、検索した行が他のユーザによって更新されたりロックされたりしないようにするためです。
但し、ロックされている行を検索することは可能です。ロックはあくまでも他のユーザによるロックや更新を防ぐためのものです。

FOR UPDATEを使用して行をロックするには以下のように実行します。
SELECT カラム名
FROM   テーブル名
WHERE  条件式
FOR UPDATE

というように最後にFOR UPDATEと記述します。
但し、FOR UPDATEは最上位のSQLにしか適用できません。副問合せにも記述することができません。
そのほかにも以下の構文とFOR UPDATEは併用するとエラーとなります。

・GROUP BY
・DISTINCT
・AVGなどのグループ関数

FOR UPDATE NOWAIT
データを検索する時にロックをかけ、且つ、既にロックがかかっている場合は即時エラーを発行したい場合、 NOWAIT キーワードを使用します。
書式は以下のようになります。
SELECT カラム名
FROM   テーブル名
WHERE  条件式
FOR UPDATE NOWAIT

これで、既にロックがかかっている行を検索した場合は、即時に「リソース・ビジー」のエラーが表示されます。

FOR UPDATE WAIT 秒数
データを検索する時にロックをかけ、且つ、既にロックがかかっている場合は指定した秒数待ってそれでもロックが掛かっている場合はエラーを発行したい場合、 WAIT キーワードを使用します。
書式は以下のようになります。
SELECT カラム名
FROM   テーブル名
WHERE  条件式
FOR UPDATE WAIT 10

上記SQLは、10秒待ってから、まだロックがかかっていればエラーを表示します。
秒数を指定しない場合、エラーとなります。

FOR UPDATE OF
SQL文が複数テーブルからなる場合に、片方のテーブルの行をロックしたい場合はロックするテーブルを明示する必要があります。
明示するには FOR UPDATE OF ロックしたいテーブルのカラム名 を使用します。
この時、カラム名はテーブルの判別に使用するため、ロックするテーブルに存在するカラムなら何でも構いません。
但し、カラムの別名は指定できませんので注意してください。

また、WAIT/NOWAITとFOR UDPATE OFを使用する場合
FOR UPDATE NOWAIT OF カラム名とするとエラーになります。
FOR UPDATE OF カラム名 NOWAITというように記述しなくてはいけません。

ロックの解除
ロックを解除するにはUPDATEします。しかし、ある条件ではUPDATEしないという状況の場合、ロックが開放されない状態になってしまいます。
このような時はCOMMIT,もしくはROLLBACKでロックを解除することができます。