2

私はこの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 ジョブが毎分起動されるようにします。チェーン ロジックは単純です。

  1. select id into id_to_process from v_buffor_waiting where rownum < 2 for update;
  2. update buffor_table set status='PROCESSING' where id = id_to_process;
  3. commit
  4. 長い計算などを行う
  5. ステータスを設定するための単純な更新/コミット操作FINISHED

1の位置で例外がスローされる可能性があることは知っていNO_DATA_FOUNDます。これは「何もしない」として処理されます。

私の手順 1 ~ 3 は 1 行のみをロックするためのもので (10 個のチェーンを並行して開始する場合、各チェーンが 1 行のみを処理するようにしたい)、手順 1 ~ 3 はアトミック操作のようになります - 他のプロセスが同じ ID を処理することはありません。

この問題に対する標準的なアプローチはありますか?

4

1 に答える 1