2

私は問題を抱えていて、解決策は簡単だという印象を持っていますが、それを理解することはできません.

Aにはマルチスレッド環境とpl sqlストアドプロシージャがあります。この手順の中には、次のようなものがあります。

select * into mycount from toto;
If mycount >0 then update...;
else insert ...;

問題は、このプロシージャを呼び出すスレッドが多数あることです。上記のコードを実行するスレッドを一度に 1 つだけにする簡単な方法はありますか? 使用できることはわかっていますselect for updateが、UPDATE または INSERT を使用できるため、これは機能しないと思います。

どうもありがとう。

4

3 に答える 3

1

あなたが望むものの最も簡単な解決策は、アプリケーションレベルである種の中間キューを導入することです.さまざまなスレッドがリクエストをキューに送信し、キュープロセッサがキューからリクエストを読み取り、必要な呼び出しを行います. DB。

私の意見では、これは、機能させるためにあまり変更する必要がないという点で、最も簡単な解決策です。唯一の潜在的な問題は、応答が必要な場合にこのソリューションが複雑になる可能性があることです。その場合でもこれはオプションですが、非同期応答を処理する必要があるため、アプリ コードが少し複雑になります。

于 2013-04-02T08:21:37.843 に答える
1

FLAG 列が 1 つだけの別のテーブル MODIFY_CHECKER を用意します。このテーブルと列を使用して、実際のテーブルで1つのスレッドのみが更新/挿入できるようにします(TOTOだと思います)

以下のようなものを既存の PL/SQL プロシージャに追加できます -

IF (select count(1) from modify_checker where flag = 1) > 0 THEN
  -- Another thread is already working, so just raise exception
  RAISE <<exception>>
ELSE
  -- No other thread working on this, so go ahead
  UPDATE modify_checker SET flag = 1;
  COMMIT;
  <<actual code to update or insert actual table>>
  UPDATE modify_checker SET flag = 0;
  COMMIT;
END IF;
于 2013-04-02T12:41:13.963 に答える