`

SELECT FOR UPDATE SKIP LOCKED --- 一个未公开但十分有用的特性

 
阅读更多

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中如何跳过被别人锁住的记录?

利用这个特点,Tomac给出了一个不跳号序列号的方法

分享到:
评论

相关推荐

    数据库oracle for update of和for update的区别

    SELECT * FROM Table1 WHERE pkid = 1 FOR UPDATE SKIP LOCKED; ``` 如果`pkid=1`的行已被锁定,则此查询将不返回任何结果,而不会等待或报错。 #### 三、实际应用案例分析 假设我们有两个会话A和B,在会话A中...

    Mysql 数据库死锁过程分析(select for update)

    避免这种死锁的一种方法是在设计事务时遵循一定的顺序规则,例如,确保所有事务按照相同的顺序访问和修改数据,或者使用`FOR UPDATE SKIP LOCKED`(Oracle支持,但MySQL不直接支持)来跳过已锁定的行。另外,可以...

    基于oracle中锁的深入理解

    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加锁的方法以及锁的查询一、oracle对select加锁方法 代码如下:create table...—session 1 模拟选中一个号码SQL> select * from test where a =1 for update skip locked; A B———- ———- 1 

    Mysql 8.0 新增特性1

    FOR UPDATE`支持`NOWAIT`和`SKIP LOCKED`选项,`NOWAIT`在遇到锁定时立即返回,而`SKIP LOCKED`则从结果集中排除被锁定的行。 5. **JSON处理增强**:引入了内联路径操作符`->>`,它等同于对`JSON_EXTRACT()`的结果...

    pg-queue:使用PostgreSQL和Node.jsTypeScript进行事务性后台处理

    pg队列 ...pg-queue使用SELECT FOR UPDATE SKIP LOCKED来获取maxProcessingConcurrency作业,这样就不会阻止并发工作程序 如果需要FIFO处理,则只需要一个消耗实例PgQueue和maxProcessingConcurrenc

    在数据库中如何高效的实现订座功能

    本篇文章将探讨如何使用数据库特性,尤其是MySQL 8.0 的SKIP LOCKED 和 NOWAIT 功能,来实现一个无阻塞、高性能的订座系统。 首先,我们需要一个基础的座位表,用来存储座位信息和预订状态。例如: ```sql CREATE ...

    Oracle行级锁的特殊用法简析

    对于SELECT语句,如果加上FOR UPDATE关键字,将获取一个排他锁,允许用户选择多行进行更新,但这些行在事务结束前对其他用户是不可见的,即其他用户无法进行修改,但可以读取。 `SELECT ... FOR UPDATE` 语句的使用...

    WPTools.v6.29.1.Pro

    // This would paint the TWPRichText, too - but TWPRichText is locked for repaint during this event AdvOfficePager1.PaintTo(Canvas, -WPRichText1.Left, -WPRichText1.Top); end; - HighlightTextColor ...

    PostgreSQL 语法

    [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 ...

Global site tag (gtag.js) - Google Analytics