-1

可能重复:
强制 Oracle 返回带有 SKIP LOCKED 的 TOP N 行

我在 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 过程的情况下如何解决这个问题?

4

2 回答 2

1

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

强制 Oracle 返回带有 SKIP LOCKED 的 TOP N 行

除了上面线程中给出的信息之外,我真的想不出另一种方法(不使用队列)。

于 2011-10-17T09:11:28.073 回答
-1

而不是SKIP LOCKED在您的示例中,您实际要求的是READ UNCOMMITTED,或者甲骨文不热衷的“脏读”。

我会阅读这个问题/答案:Oracle 是否允许未提交的读取选项?

于 2011-10-17T08:20:21.513 回答