| FOR UPDATE NOWAIT |
|
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でロックを解除することができます。 |