0

処理の負荷を共有するさまざまなマシン上に、サービスの複数のインスタンスを使用してシステムを構築しようとしています。

これらはそれぞれテーブルをチェックし、そのテーブルで処理される行がある場合は、最初に選択し、処理済みとマークし、次に処理してから完了とマークします。すすぎを繰り返します。

2つのインスタンスAとBが次のことを行う競合状態を防ぐための最良の方法は何ですか

A(1)テーブルを読み取り、処理する行1を検索し、B(1)テーブルを読み取り、処理する行1を検索し、A(2)行処理をマークしますB(2)行処理をマークします

1つのアプリで、ロックまたはミューテックスを使用できます。

A1とA2を1つのトランザクションに入れることができますが、それは簡単ですか、それともこれを行うためのより良い、より高速な方法がありますか?

手順が次のようになるように、頭をオンにする必要があります。

A(1)次の行を処理するために私のものとしてマークします。(2)処理のためにそれを私に返します。

これまで何度も解決しなければならなかったと思うので、「標準」の解決策を探しています。複数ある場合は、メリットとデメリットがあります。

4

1 に答える 1

0

トランザクションは素晴らしく単純な答えですが、2つの欠点が考えられます。

1)データベースの詳細を確認することをお勧めします。デフォルトの整合性設定では、考えられるすべての状況で絶対的な整合性が保証されない場合があります。

2)データベースを使用して作業をキューに入れて分散することに関連するアクセスのパターンは、それを予期していないデータベースでは難しい場合があります。

1つの可能性は、信頼できるメッセージキューシステムを調べることです。これは、探しているものと非常によく一致しているようです。ワーカーマシンは、共有キューから作業を読み取ることができます。可能なジャンプオフポイントは、 http://en.wikipedia.org/wiki/Message_queueおよびhttp://docs.oracle.com/cd/B10500_01/appdev.920/a96587/qintro.htmです。

于 2012-09-14T18:20:59.907 に答える