从具有多个会话的同一表中选择[重复]

问题描述 投票:-1回答:2

可能重复:Force Oracle to return TOP N rows with SKIP LOCKED

我在Oracle上使用FOR UPDATE子句遇到一些问题。我想做的是从一个表中选择多个值(例如1000,但是用户可能在运行时更改此值)并处理它们。但是,我的应用程序可能在多个节点上运行,并且所有节点都将使用同一张表,因此我必须锁定记录以防止多个节点提取相同的记录。

为了演示它,让我们创建一个示例表:

CREATE TABLE t (ID PRIMARY KEY) AS SELECT ROWNUM FROM dual CONNECT BY LEVEL <= 1000;

这是我选择记录的方式。在这里,我尝试获取3条记录。

SELECT rownum r, a.ID i
  FROM (SELECT * FROM t ) a 
 WHERE  rownum <= 3
 FOR UPDATE skip locked 

此查询返回3条记录

+---+---+
+ R + I +
+---+---+
+ 1 + 1 +
+---+---+
+ 2 + 2 +
+---+---+
+ 3 + 3 +
+---+---+

[当我从另一个会话中运行相同的查询时(没有提交会话1),我得到一个空的结果集。但是我真正想要的是获取接下来的3个项目(在这种情况下为4、5、6)。我了解这是预期的行为,但是无法找到合适的解决方案。如何在不创建Oracle过程的情况下解决此问题?

oracle select locking rownum
2个回答
1
投票

这是以前出现的,然后我给出了一个相当详细的答案:

Force Oracle to return TOP N rows with SKIP LOCKED

除了上面线程中给出的信息外,我真的无法想到其他方法(没有使用队列)。


-1
投票

不是您的示例中的SKIP LOCKED,而是您实际要求的是READ UNCOMMITTED,或者Oracle不热衷的'脏读'。

我已阅读此问题/答案:Does oracle allow the uncommitted read option?

© www.soinside.com 2019 - 2024. All rights reserved.