1

My server application that is written in C# starts a new thread every time it needs to insert or remove data from the database. The problem is that since the execution of the threads is arbitrary it is not ensured that a delete command is executed after the insertion of the same object if those events occur almost at the same time.

E.g.: The server receives the command to insert multiple objects. It takes about 5 seconds to insert all the object. After 1 second of execution the server receives the command to delete all those objects again from the database. Since the removal could happen before all objects are completely stored the outcome is unknown.

How can the order of execution of certain thread be managed?

4

4 に答える 4

2

これにはトランザクションを使用し、さまざまな操作にさまざまなレベルを指定できます。

たとえば、書き込み/更新/削除には最高レベルのトランザクションを使用し、読み取りには低レベルを使用できます。これを微調整して、テーブルと比較して特定の行のみをブロックできるようにすることもできます。特定の用語は、使用するデータベースとデータ アクセス ライブラリによって異なります。

注文を使用しないことをお勧めします。並列と順序付けはうまくいきません。例えば:

  • サーバーを水平方向にスケーリングする必要があります。2 番目のサーバーとロード バランサーを追加すると、ミューテックス ソリューションは機能しません。

  • 大規模な分散システムでは、メッセージ キューは機能しません。1 つのスレッドがスキャンを完了し、実行を開始することを決定するまでに、別のスレッドが操作の実行を妨げるはずのメッセージを書き込む可能性があるからです。さらに、負荷が高い場合、同じキューを複数回スキャンするのは非効率的です。

于 2013-03-13T12:01:09.693 に答える
0

削除の前に挿入を受け取ることがわかっていて、問題が挿入を中断したくないということだけである場合は、挿入コードでロックを使用できます。

static object m_Lock = new object();

public void Insert()    
{
   lock (m_Lock)
   {
      InsertRecords();
   }
}

public void Remove()    
{
   lock (m_Lock)
   {
      RemoveRecords();
   }
}

このようにして、挿入中に削除が発生しないことを確認できます。

PS挿入してすぐに削除する必要があるのに、奇妙に思えます。

于 2013-03-13T11:59:39.003 に答える
0

最も簡単な方法は、1 つのコレクションにオブジェクトを挿入するすべての受信要求をキューに入れ、2 番目のコレクションにオブジェクトを削除するすべての受信要求をキューに入れることだと思います。

サーバーには、次の基本的なループが必要です。

を。着信挿入があるかどうかを確認し、ある場合は -> すべての挿入を実行します。

b. 着信削除要求があるかどうかを確認し、ある場合は -> すべての削除要求を実行します。

c. X ミリ秒間スリープします。

ここで、存在しないオブジェクトに対して削除要求があるとします。次の 2 つのオプションがあります。

を。この要求を無視して破棄します。

b. このラウンドのこのリクエストを無視し、削除する前に次の N ラウンドのコレクションに保持します(最後に削除します。これは単に悪いリクエストであり、競合状態の問題ではないと仮定します)。

于 2013-03-13T12:02:16.220 に答える
0

Queue を (単一のサービス スレッドで) 使用して、順序付けを強制します。タスク並列ライブラリを使用して、他のタスクに依存するタスクを管理することもできますが、任意の DB 操作では非常に困難です。

着信操作をどのように管理するか、また、このように複数のスレッドを安全に使用できるように相互依存関係が十分に予測可能かどうかを再考する必要があると思います。その目標を達成するために、受信操作に「依存する」情報を追加する必要がある場合があります。

于 2013-03-13T13:18:50.510 に答える