从具有多个会话的同一表中选择

时间:2011-10-17 08:16:40

标签: oracle select locking rownum

  

可能重复:
  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过程的情况下解决这个问题?

2 个答案:

答案 0 :(得分:1)

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

Force Oracle to return TOP N rows with SKIP LOCKED

我真的不能想到另一种方式(使用队列的方式)而不是上面线程中给出的信息。

答案 1 :(得分:-1)

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

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