【发布时间】:2011-10-09 20:43:45
【问题描述】:
SELECT
id
FROM table_name tkn1,
(SELECT
id,
ROWNUM rnum
FROM table_name
WHERE
PROCS_DT is null
order by PRTY desc, CRET_DT) result
WHERE tkn1.id= result.id
AND result.rnum <= 10 FOR UPDATE OF tkn1.id SKIP LOCKED
这是我的问题。 2 个线程同时访问此查询
线程 1 - 执行选择并锁定 10 行,按优先级和创建日期降序排列。接下来,我将通过单独的查询将 procs_dt 更新为今天的日期。
线程 2 - 在从线程 1 更新 procs_dt 或提交之前,该线程执行该查询。我的要求是接下来的 10 个未锁定行必须移交给线程 2。但真正发生的是同一组锁定行来自内部查询,因为 procs_dt 仍然为空并且尚未由线程 1 更新,并且由于跳过在外部查询中给出了锁定,所有这 10 行都被跳过并且没有记录返回给线程 2 处理
这最终破坏了我的多线程要求。
如何修复此查询?我尝试将锁定的跳过添加到内部查询。但是 oracle 11g 不允许这样做。
请专家帮忙。我正在使用 oracle 11g
【问题讨论】:
-
您已经告诉我们您在技术上做了哪些工作,哪些做不到。您能否还指定功能要求是什么?也许我们可以想出一个完全不同的方法。
-
我有 2 个节点,其中运行相同批处理应用程序的 2 个实例。我有一个需要由这两个实例共享的数据库模式。 2个批处理实例需要同时查询一张表并处理那些记录一半/一半。如果表有 10k 条记录,我希望每个节点处理 5k 条记录。我正在使用 spring 批处理框架、oracle 11g 并进行面向块的处理。即节点将一次处理 10 条记录,然后获取 10 条记录的下一个块,然后继续处理,直到没有更多行要处理。我在处理记录时更新处理日期
标签: sql oracle concurrency locking oracle11g