当前位置:数据库 > Oracle >>

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会跳过被锁住的行,只查询没有锁住的行。  
 
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,