-
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会跳过被锁住的行,只查询没有锁住的行。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31349667/viewspace-2123218/
,如需转载,请注明出处,否则将追究法律责任。