現在、私のアプリケーションには、3分間隔でトリガーされるdbmsジョブが1つあります。Dbmsジョブは、グローバル一時テーブルを使用するプロシージャを呼び出します。
シナリオ:
1.私の最初のジョブが時間(X)にトリガーされ、完了するまでに約1時間かかるとしましょう。
2.その間、2番目のジョブが時間(X + 3分)にトリガーされます。
質問:
これらの2つのdbmsジョブは同じ接続を共有していますか?つまり、グローバル一時テーブルに同じセッションを使用するのでしょうか。
現在、私のアプリケーションには、3分間隔でトリガーされるdbmsジョブが1つあります。Dbmsジョブは、グローバル一時テーブルを使用するプロシージャを呼び出します。
1.私の最初のジョブが時間(X)にトリガーされ、完了するまでに約1時間かかるとしましょう。
2.その間、2番目のジョブが時間(X + 3分)にトリガーされます。
これらの2つのdbmsジョブは同じ接続を共有していますか?つまり、グローバル一時テーブルに同じセッションを使用するのでしょうか。
Oracle は、INTERVAL で指定された間隔よりも完了するまでに時間がかかる場合でも、同じジョブを 2 回自動的に開始しません。強制的に 2 回実行すると、データベース セッションは共有されません。
編集:特定の間隔で並行して実行するには、次のようにします。
declare id number;
begin
dbms_job.submit(id, 'myjobstarter;', sysdate, 'sysdate+3/24/60');
commit;
end;
create procedure myjobstarter as
id number;
begin
dbms_job.submit(id, 'longRunningProcedure;');
commit;
end;
したがって、通常のジョブは、実行するたびに新しいジョブを送信します。しかしもちろん、この方法ではロックの問題やその他の競合状態に遭遇する可能性があります。また、DBMS_JOB はジョブを並行して無限に実行しないため、実際の動作は少し予測不能になる可能性があることに注意してください。