15

このlockステートメントは、あるスレッドがコードのクリティカル セクションに入っているときに、別のスレッドがクリティカル セクションに入らないようにします。ただし、ワークロードがサーバー ファーム全体に分散している場合 (たとえば、いくつかの IIS サーバー + ロード バランサー) は機能しません。

.NET はそのようなシナリオをサポートしていますか?
複数のマシンで実行されているスレッドによる重要なコード セクションの実行を制御するために使用できるクラスはありますか?

そうでない場合、そのような問題を処理する標準的な方法はありますか?

この質問は、ここで始まった議論に触発されたものですが、SharePoint や ASP.NET に限定されません。

4

5 に答える 5

6

一元化された SQL Server インスタンスにアクセスできる場合は、それを使用して分散ロック コーディネーターとして機能し、sp_getapplockおよびsp_releaseapplockストアド プロシージャを使用してアプリケーション ロックを管理できます。

SQL Server 2005 のアプリケーション ロック (またはミューテックス)

于 2011-11-18T22:10:57.420 に答える
4

このlockステートメントは、プロセス内でリソースを共有する場合にのみ役立ちます。

MutexおよびEventWaitHandleクラスは、 で始まる名前を使用する場合に、1 台のマシン上の複数のプロセス間でリソースを共有するのに役立ちます"Global\"

さらに、共有 SQL データベースでsp_getapplock/を使用するなど、.NET の外部で何かを実装する必要があります。sp_releaseapplock

于 2011-11-18T21:43:06.767 に答える
1

標準シナリオのマシンのネットワークは共有メモリで動作しないため、同期に使用できる単一の変数のグローバル ビューがありません。したがって、メッセージ パッシングによってロックを実装する必要があります。

共有リソースをロックしたい場合は、中央の「マスター」にそのリソースへのアクセスを規制させることができます。

編集: リソースを共有する必要がない場合 (バリアなど)、たとえば MSMQ を使用してマシン間でメッセージを渡すことができます。ソケットのレベルが低すぎる可能性があります。

于 2011-11-18T21:38:06.347 に答える
1

現在、ASP.NET でマシン間スレッド制御を実装する方法はありません。ただし、これはより高いレベルのアプリケーション アーキテクチャを介して実装できます。基本的に、独自のビジネス ロジックを使用して自分で実装する必要があります。

アーキテクチャ的には、ソリューションに ILockable インターフェイスを導入し、それを実装するために何らかの条件で動作を停止する必要があるクラスを用意する必要があります。次に、ゲートウェイのセットを使用して、これらのロックを相互に管理します。

于 2011-11-18T21:39:21.120 に答える
1

クロスマシン ロックをネイティブにサポートできる .Net はありません。

標準的な方法は、そのようなことの責任を 1 つの場所、場合によっては Web サービス (負荷分散されていない!) に移動することです。これにより、複数の場所から呼び出すことができます。または、代わりに、すべて (データベースなど) からアクセスできる単一のリソースを定義し、これを取得する単一のリソースとして使用します (たとえば、ロックテーブルにキーを書き込みます。キーが存在する場合、行が削除されるまでロックを取得できません)。

于 2011-11-18T21:39:59.540 に答える