Oracle DB 读取下一个未锁定的行
Posted
技术标签:
【中文标题】Oracle DB 读取下一个未锁定的行【英文标题】:Oracle DB read next unlocked row 【发布时间】:2017-10-31 13:11:39 【问题描述】:我在我的应用程序的三个不同实例上运行以下查询,它们都试图从表中逐一读取行作为队列。
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】:SKIP LOCKED
处理发生在查询返回行之后。由于ROWNUM<=1
,您的谓词在仅读取一条记录后停止,因此如果它找到的记录已被另一个会话锁定,您的查询将跳过它并停止查找更多记录。
如果您只想一次处理一条记录,只需从游标中获取一条记录,而不是使用ROWNUM
来限制它。
【讨论】:
如何从游标中只获取一条记录?我正在使用 rownum 来限制它,所以我可以通过按升序排序 id 来获取系统中输入的第一条记录。fetch cur into r
docs.oracle.com/database/121/LNPLS/…以上是关于Oracle DB 读取下一个未锁定的行的主要内容,如果未能解决你的问题,请参考以下文章