Oracle给Select结果集加锁,Skip Locked(跳过加锁行获得可以加锁的结果集)

Posted Green.Leaf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle给Select结果集加锁,Skip Locked(跳过加锁行获得可以加锁的结果集)相关的知识,希望对你有一定的参考价值。

1、通过select for update或select for update wait或select for update nowait给数据集加锁

具体实现参考select for update和select for update wait和select for update nowait的区别

2、Skip Locked(跳过加锁行获得可以加锁的结果集)

Skip locked是oracle 11g引入的。

通过skip locked可以使select for update语句可以查询出(排除已经被其他会话加锁了的数据行)剩下的数据集,并给剩下的数据集,进行加锁操作。

a、测试一、

代码如下:新建一个SQL窗口1(相当于新建一个会话),执行

update test8 set price=6 where ID=1

但是不执行commit操作,此时,当前数据已经被加锁了。

然后,在新建一个SQL窗口2(相当于新建一个会话),执行

select * from test8 for update skip locked

根据结果集,我们发现ID=1的数据行被排除了

 

b、测试二

新建SQL窗口1(相当于新建一个会话)代码如下:执行如下语句

select * from test8 for update

此时,不进行commit操作,表中所有的数据行被加锁。根据测试一的结果得出推论:如果使用skip locked的话将查询不出任何结果

新建SQL窗口2(相当于新建一个会话)代码如下:执行如下语句

select * from test8 for update skip locked

没有查出任何结果集,ok,推论正确!

 

以上是关于Oracle给Select结果集加锁,Skip Locked(跳过加锁行获得可以加锁的结果集)的主要内容,如果未能解决你的问题,请参考以下文章

(转)Oracle中的rownum,ROWID的 用法

关于oracle和mysql数据库的查询问题

java 如何接收 oracle 的 select 查询结果 并赋值给变量

查询数据库中第n行数据

Oracle EBS 加锁解锁程序

看了一下,MYSQL在读写时会自动给表或者行加锁,那为啥还会出现所谓的并发问题?