SELECT ... FOR UPDATE(WAIT/NOWAIT)命令与ORACLE锁

oracle锁的排队机制:
 

    请求锁定需要排队。如果某个会话请求一个锁定,但是由于其他会话已经锁定了指定记录或对象而无法获得所需的锁定,那么这个会话将会等待。此时,可能多个会话都在等待访问相同记录或对象,在这种情况下,ORACLE会跟踪这些会话请求锁定的顺序。
 
    如果不希望某个会话在无法获得锁定时进行排队等候,那么避免排队的唯一方式是使用SELECT ... FOR UPDATE(子句WAIT/NOWAIT)命令。SELECT ... FOR UPDATE命令会采用专用的模式来选择和锁定记录。如果某条记录已被锁定,那么在锁定被释放前,SELECT ... FOR UPDATE语句会像DML语句一样进行排队并挂起会话。使用子句NOWAIT或WAIT <n>就可以避免挂起会话,其中<n>是以秒为单位的数值。

 
    我们在使用ORACLE进行数据处理的时候,有时需要对查询出来的记录进行锁定,禁止其他进程对该记录进行修改操作。
 
    oracle数据库提供了一种利用SELECT的FOR UPDATE子句实现的方法(可能sqlserver也有这个功能,但是没有测试过)。通过select * from ta for update方法,可以将查询结果中的记录进行update锁定,及不允许其他进行对这些记录进行修改。我们还可以通过select * from a for update of a.a;(a表的a列)对记录中的某一列进行锁定。

      当我们使用FOR UPDATE子句将记录锁定后,其他进程在对锁定记录进行update或delete操作时,就会处于停顿状态,等待解锁。当锁定进程释放锁定以后才会继 续执行。如果不想其他进行进入停顿状态,可以用nowait子句,直接返回操作异常信息,提示操作的记录处于锁定状态不能进行修改。

      所以我们在做多线程同步时,可以通过select * form ta for update nowait的方法防止多个进程同时操作同一数据。

      这种锁定方式是建立在数据库连接的基础上,一旦连接断开或者锁定进程commit时,这种锁定就自动解除。同时这种锁定方式是一种update锁定,锁定时不影响其他的select操作。

### Oracle NOWAIT 选项详解 NOWAITOracle 数据库中用于控制行为的关键字之一。当会话尝试获取资源上的定时,如果该资源已经被其他事务占用,则默认情况下当前会话会被挂起直到获得所需的。然而,在某些场景下这种等待机制并不合适。 通过指定 `NOWAIT` 参数,可以让查询立即返回而不是进入阻塞状态。具体来说: - 如果请求能够立刻成功(即不存在冲突),则正常处理; - 若存在竞争情况无法满足条件,则抛出异常告知调用者失败[^1]。 #### 使用示例 ##### 表级定 对于 DDL 操作而言,默认就是非等待模式;而对于 DML 来说,则可以通过显式声明来实现相同效果: ```sql LOCK TABLE employees IN EXCLUSIVE MODE NOWAIT; ``` 上述命令试图独占定整个 EMPLOYEES 表,但如果此时表正被另一个事务所持有,则不会陷入无限期等待而是马上报错退出。 ##### 更新语句 同样地,在 UPDATE 中也可以加入此参数防止潜在的死风险: ```sql UPDATE departments SET location = 'New York' WHERE department_id = 90 FOR UPDATE OF salary NOWAIT; ``` 这里表示更新 DEPARTMENTS 行的同时对其加保护,但不允许有其它写入干扰,并且一旦发现已有未提交更改就放弃执行。 ##### 插入选项 INSERT ... SELECT 结构里也能利用 NOWAIT 防止因目标表正在经历大量读取而导致长时间延迟: ```sql INSERT INTO new_table (SELECT * FROM old_table ORDER BY id FETCH FIRST 1 ROW ONLY) NOWAIT; ``` 需要注意的是并非所有的 SQL 版本都支持在 INSERT 后面紧跟 NOWAIT 子句,因此实际应用前应当查阅官方文档确认兼容性问题[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值