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&lt;=1,您的谓词在仅读取一条记录后停止,因此如果它找到的记录已被另一个会话锁定,您的查询将跳过它并停止查找更多记录。

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

【讨论】:

如何从游标中只获取一条记录?我正在使用 rownum 来限制它,所以我可以通过按升序排序 id 来获取系统中输入的第一条记录。 fetch cur into r docs.oracle.com/database/121/LNPLS/…

以上是关于Oracle DB 读取下一个未锁定的行的主要内容,如果未能解决你的问题,请参考以下文章

如何解锁DB2中被锁定的表

MySQL InnoDB - 在使用连接表进行锁定读取期间,即使没有选择任何列,连接的行也会被锁定吗?

Berkeley DB:锁定记录而不读取它

如何在没有超时的情况下锁定 Ibm Db2 中的更新行?

db2数据库里面的一张表被锁定,怎么解锁

db2数据库里面的一张表被锁定,怎么解锁