我们试图解决的问题看起来像这样.
我们的解决方案是为卡分配状态,并存储它的预订日期.在预订卡时,我们使用"select for update"语句来完成.该查询查找可用的卡和很久以前保留的卡.
但是,我们的查询无法正常工作.
我准备了一个简化的情况来解释这个问题.我们有一个card_numbers表,充满了数据 - 所有行都有非空的id号.现在,让我们试着锁定其中一些.
-- first, in session 1
set autocommit off;
select id from card_numbers
where id is not null
and rownum <= 1
for update skip locked;
Run Code Online (Sandbox Code Playgroud)
我们不在此处提交事务,必须锁定行.
-- later, in session 2
set autocommit off;
select id from card_numbers
where id is not null
and rownum <= 1
for update skip locked;
Run Code Online (Sandbox Code Playgroud)
预期的行为是,在两个会话中,我们得到一个满足查询条件的不同行.
但是它不起作用.取决于我们是否使用查询的"跳过锁定"部分 - 行为更改:
因此,经过这么长时间的介绍就会出现问题.
Oracle中可能存在所需的锁定行为吗?如果是,那么我们做错了什么?什么是正确的解决方案?