Oracle DB读取下一个未锁定的行

时间:2017-10-31 13:11:40

标签: sql oracle locking oracle12c

我在我的应用程序的三个不同实例上运行以下查询,所有这些实例都试图逐个读取表中的行作为队列。

SELECT * FROM order_request_status ors WHERE ors.status = 'new' and ROWNUM <= 1 order by ors.id asc for update skip locked 

现在的问题是,如果行被一个应用程序实例锁定,我希望我的第二个应用程序实例通过查询读取下一个未锁定的行。但它不能正常工作 - 更新跳过锁定。

请建议我如何使用oracle db实现类似功能的队列。

1 个答案:

答案 0 :(得分:0)

SKIP LOCKED处理在查询返回行之后发生。由于ROWNUM<=1读取了一条记录后,您的谓词停止,因此如果找到的记录已被另一个会话锁定,则您的查询会跳过它并停止查找更多记录。

如果您只想一次处理一条记录,只需从光标中提取一条记录,而不是使用ROWNUM来限制它。