我在我的应用程序的三个不同实例上运行以下查询,所有这些实例都试图逐个读取表中的行作为队列。
SELECT * FROM order_request_status ors WHERE ors.status = 'new' and ROWNUM <= 1 order by ors.id asc for update skip locked
现在的问题是,如果行被一个应用程序实例锁定,我希望我的第二个应用程序实例通过查询读取下一个未锁定的行。但它不能正常工作 - 更新跳过锁定。
请建议我如何使用oracle db实现类似功能的队列。
答案 0 :(得分:0)
SKIP LOCKED
处理在查询返回行之后发生。由于ROWNUM<=1
读取了一条记录后,您的谓词停止,因此如果找到的记录已被另一个会话锁定,则您的查询会跳过它并停止查找更多记录。
如果您只想一次处理一条记录,只需从光标中提取一条记录,而不是使用ROWNUM
来限制它。