我在这个FIDDLE中有这样的表:
CREATE TABLE buffor_table
("ID" int, "NAME" varchar2(10), "STATUS" varchar2(10))
;
INSERT ALL
INTO buffor_table ("ID", "NAME", "STATUS")
VALUES (1, 'something1', 'PROCESSING')
INTO buffor_table ("ID", "NAME", "STATUS")
VALUES (2, 'something2', 'WAITING')
INTO buffor_table ("ID", "NAME", "STATUS")
VALUES (3, 'something3', 'WAITING')
INTO buffor_table ("ID", "NAME", "STATUS")
VALUES (4, 'something4', 'FINISHED')
SELECT * FROM dual
;
CREATE OR REPLACE VIEW V_BUFFOR_WAITING AS
SELECT ID, NAME, STATUS FROM BUFFOR_TABLE
WHERE STATUS = 'WAITING';
我需要有一些流程/作业,每分钟都会查找处于“WAITING”状态的行,然后每一个都跨越新的子流程来完成这项工作。
我想提供这个解决方案;创建 10 个链(使用 Oracle 链)并将它们设置为并行执行,并且每分钟触发一次 oracle 作业。链逻辑将很简单:
select id into id_to_process from v_buffor_waiting where rownum < 2 for update;
update buffor_table set status='PROCESSING' where id = id_to_process;
commit
- 做一些长时间的计算等
- 用于将状态设置为的简单更新/提交操作
FINISHED
我知道NO_DATA_FOUND
可以在位置 1 抛出异常。它将被视为“无事可做”。
我的步骤 1-3 仅锁定一行(当启动 10 个并行链时,我希望每个链只处理一行),步骤 1-3 将类似于原子操作 - 没有其他进程将具有相同的 ID 来处理。
有没有解决这个问题的标准方法?