私はこの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
1の位置で例外がスローされる可能性があることは知っていNO_DATA_FOUND
ます。これは「何もしない」として処理されます。
私の手順 1 ~ 3 は 1 行のみをロックするためのもので (10 個のチェーンを並行して開始する場合、各チェーンが 1 行のみを処理するようにしたい)、手順 1 ~ 3 はアトミック操作のようになります - 他のプロセスが同じ ID を処理することはありません。
この問題に対する標準的なアプローチはありますか?