排他ロックをかけるには、for update または、for update nowaitを使います。
構文
排他ロックには、ロック時に待つパターンと待たないパターンがあります
- (構文 - ロックされていた場合は即時排他エラーとする場合)
- <SELECT文> for update nowait
- (構文 - ロックされていた場合はロックが解除されるまで待機する場合)
- <SELECT文> for update
サンプル
例)排他ロックを掛けて検索する(ロック中の場合は待つ)
- SQL*Plus
- SQL> select * from m_user where user_cd = '001' for update; USER_CD USER_NM --------- --------------- 001 xxx
この場合、対象データがロック済みの場合は待ち状態になります。
例)排他ロックを掛けて検索する(ロック中の場合は即エラーとする)
- SQL*Plus
- SQL> select * from m_user where user_cd = '001' for update nowait; USER_CD USER_NM --------- --------------- 001 xxx
この場合、対象データがロック済みの場合は即エラーとなります。
※ロック済みの場合は以下のような結果となります。
- SQL> select * from m_user where user_cd = '001' for update nowait; * 行1でエラーが発生しました。: ORA-00054: リソース・ビジー。NOWAITが指定されているか、タイムアウトしました
解説
- for update(for update nowait)で掛けたロックを解除するには、commitまたはrollbackを実行すれば解除できます。