Oracle Skip Locked
原文链接:http://www.javaarch.net/jiagoushi/704.htm
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会跳过被锁住的行,只查询没有锁住的行。