可能重复:
Force Oracle to return TOP N rows with SKIP LOCKED选择与多个会话
我遇到一些问题,在Oracle 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过程的情况下解决此问题?
我会使用BULK COLLECT和LIMIT参见:http://stackoverflow.com/questions/6770317/sql-for-update-skip-locked-query-and-java-multi-threading-how-to-fix-这个 –