首页 > 代码库 > Oracle给Select结果集加锁,Skip Locked(跳过加锁行获得可以加锁的结果集)

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(跳过加锁行获得可以加锁的结果集)