Oracle Skip Locked
Oracle Skip Locked
[html]
Oracle Skip Locked
Oracle 11g引入skip locked。
Skip Locked 是在query select语句中跳过已经被其他正在执行的query select语句锁住的行,只执行能够获得锁的行。
select for update如何查询大数量,那么其他session同时执行的select语句可能会等待锁超时而报下面这个错
ORA-30006: resource busy; acquire with WAIT timeout expired
如果是不超时的case,那么会出现
ORA-00054 resource busy and NOWAIT specified
比如session1执行下面语句:
SELECT *
FROM dept WHERE
deptno = 10
FOR UPDATE NOWAIT;
输出:
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
session2执行下面语句:
SELECT * FROM dept
WHERE deptno IN (10,20)
FOR UPDATE NOWAIT;
那么输出:
SELECT * FROM dept WHERE deptno IN (10,20)
FOR UPDATE NOWAIT
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified
因为session1已经锁住10这一行,session2请求获得不到10这一行的锁,就报错了。
那么在session2我们可以使用skip locked
SELECT * FROM dept
WHERE deptno IN (10,20)
FOR UPDATE SKIP LOCKED;
此时输出:
DEPTNO DNAME LOC
---------- -------------- -------------
20 RESEARCH DALLAS
SKIP LOCKED会跳过被锁住的行,只查询没有锁住的行。