在我们日常操作Oracle数据库的时候,我们经常会使用 select for update 来修改我们的查询结果,所以select for update语句是对select 查询结果加行锁。那么select for update skip locked 语句又有什么用呢?
如果我们在session1中执行以下语句:
select * from user where userid=1 for update;
输出:
userid username
- - - - - - - - - - - - - - - -
1 呵呵
session2执行下面语句:
select * from user where userid in (1,2) for update;
输出:
select * from user where userid in (1,2) for update;
ORA-000054:resource busy and acquire with NOWAIT specified
因为我们在sessio1中已经将userid=1的行锁住了,然后在session2的请求获取不到userid=1的锁,所以就会报错!
如果我们在session2中使用skip locked:
select * from user where userid in (1,2) for update skip locked;
userid username
- - - - - - - - - - - - - - -
2 哈哈
通过上面的分析,select for update skip locked 就是在尝试加锁之前判断记录是否已经被其他用户锁定,如果已经锁定,这跳过该已锁订记录,如果没有被锁定,就锁定该没有被锁定的记录。