Oracle加锁

来源:互联网 发布:mac笔记本怎么清理垃圾 编辑:程序博客网 时间:2024/06/04 19:17
lock table 表名 exclusive mode nowait; -- 锁整个表

select * from 表名 where XXX for update nowaitl -- 锁符合条件的记录


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会跳过被锁住的行,只查询没有锁住的行。




0 0
原创粉丝点击