SELECT FOR UPDATE SKIP LOCKED 选项是ORACLE的一个未公开的特性,它的含义是SELECT时跳过被锁的记录。
考虑下面的例子:
会话1:
SQL> select * from sex_dict ;
SERIAL_NO S SEX_ INPUT_CO
---------- - ---- --------
1 1 男 N
9 0 未知 WZ
2 2 女 N
4 9 未定 WD
SQL> select * from sex_dict where serial_no = 1 for update ;
SERIAL_NO S SEX_ INPUT_CO
---------- - ---- --------
1 1 男 N
会话2:
查询并锁住serial_no in (1,2) 的记录
SQL> select * from sex_dict where serial_no in ( 1, 2) for update ;
此时会话2挂住,直到会话1事务结束。
加上”NOWAIT”选项
SQL> select * from sex_dict where serial_no in ( 1, 2) for update nowait ;
select * from sex_dict where serial_no in ( 1, 2) for update nowait
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified
因为serial_no = 1的记录被会话锁住,所以这个操作没有成功。
加上SKIP LOCKED选项
SQL> select * from sex_dict where serial_no in ( 1, 2) for update nowait skip locked;
SERIAL_NO S SEX_ INPUT_CO
---------- - ---- --------
2 2 女 N
会话2只锁住serial_no=2的记录,跳过serial_no=1的记录。
这个特性适合例如消息队列的操作,当消息到达时,处理消息的各个客户选取并锁住一个消息处理,但不能阻塞其它客户处理消息。其它客户则处理没有被锁的消息。这个可以参考AnySQL.net的《在Oracle中如何跳过被别人锁住的记录?》
相关推荐
SELECT * FROM Table1 WHERE pkid = 1 FOR UPDATE SKIP LOCKED; ``` 如果`pkid=1`的行已被锁定,则此查询将不返回任何结果,而不会等待或报错。 #### 三、实际应用案例分析 假设我们有两个会话A和B,在会话A中...
避免这种死锁的一种方法是在设计事务时遵循一定的顺序规则,例如,确保所有事务按照相同的顺序访问和修改数据,或者使用`FOR UPDATE SKIP LOCKED`(Oracle支持,但MySQL不直接支持)来跳过已锁定的行。另外,可以...
1级锁主要应用于SELECT查询,通常不会出现在`v$locked_object`视图中,除非进行了特殊的SELECT操作,如`SELECT FOR UPDATE`。 2级锁包括`SELECT FOR UPDATE`、`LOCK TABLE ... FOR UPDATE`和`LOCK ROW SHARE SELECT...
解析oracle对select加锁的方法以及锁的查询一、oracle对select加锁方法 代码如下:create table...—session 1 模拟选中一个号码SQL> select * from test where a =1 for update skip locked; A B———- ———- 1
FOR UPDATE`支持`NOWAIT`和`SKIP LOCKED`选项,`NOWAIT`在遇到锁定时立即返回,而`SKIP LOCKED`则从结果集中排除被锁定的行。 5. **JSON处理增强**:引入了内联路径操作符`->>`,它等同于对`JSON_EXTRACT()`的结果...
pg队列 ...pg-queue使用SELECT FOR UPDATE SKIP LOCKED来获取maxProcessingConcurrency作业,这样就不会阻止并发工作程序 如果需要FIFO处理,则只需要一个消耗实例PgQueue和maxProcessingConcurrenc
本篇文章将探讨如何使用数据库特性,尤其是MySQL 8.0 的SKIP LOCKED 和 NOWAIT 功能,来实现一个无阻塞、高性能的订座系统。 首先,我们需要一个基础的座位表,用来存储座位信息和预订状态。例如: ```sql CREATE ...
对于SELECT语句,如果加上FOR UPDATE关键字,将获取一个排他锁,允许用户选择多行进行更新,但这些行在事务结束前对其他用户是不可见的,即其他用户无法进行修改,但可以读取。 `SELECT ... FOR UPDATE` 语句的使用...
// This would paint the TWPRichText, too - but TWPRichText is locked for repaint during this event AdvOfficePager1.PaintTo(Canvas, -WPRichText1.Left, -WPRichText1.Top); end; - HighlightTextColor ...
[FOR {UPDATE | NO KEY UPDATE | SHARE | KEY SHARE} [OF table_name, ...] [NOWAIT | SKIP LOCKED]] ``` - `SELECT` 后面跟随你要检索的列名或表达式,可以使用 `*` 代表所有列。 - `FROM` 后指定数据源,即你要...
This specification was developed in response to a perceived need for a standardized programming inter-face to digitizing tablets, three dimensional position sensors, and other pointing devices by a ...