2016-03-22 3 views
0

私はSQLテーブル内でローカルに値を探すサービスを持っています。値が存在しない場合は、リモート呼び出しを行っています。リモート呼び出しから返された値がある場合、この値はローカルSQLテーブルに追加されます。排他的なリソースアクセスのHTTPリクエストをロックする

私は、文字列値XXXが既に存在することをログファイル内のユニークインデックス例外に通知しました。以下が起こったことを意味私に

Request1_localSqlCheck 
Request1_remoteCheck 
Request2_localSqlCheck 
Request2_remoteCheck 
Request1_AddValueLocallyIfRecievedByRemote 
Request2_AddValueLocallyIfRecievedByRemote // Same value Added here causes exception. 

私はすべての3つのステップに原子を作り、それをロックしたい:

Lock 
{ 
Request1_localSqlCheck 
Request1_remoteCheck 
Request1_AddValueLocallyIfRecievedByRemote 
} 

この作品は、これらの3つのメソッド呼び出しの周りにロックをかけます?

+1

ロックはプロセス境界を越えません。このサービスがファームまたは複数のワーカーで実行されている場合、ロックでは不十分です。 – CodeCaster

+0

リモートサービスはcloundでは実行されますが、1つのインスタンスに制限されます。 – Elisabeth

答えて

0

Mutexを使用すると、サーバーが値を返すまでコードの実行をブロックできます。例えば

:このコードは非常に頻繁に呼び出された場合、それは、ミューテックスを待つ必要があります他のすべてのスレッドが遅くなりますので

private readonly Mutex m = new Mutex(); 

    public int ThreadSafeMethod() { 

     // you can do this immediately to skip the mutex 
     if (Request1_localSqlCheck == 1) return 1; 

     m.WaitOne(); 

     try { 
      // check again 
      if (Request1_localSqlCheck == 1) return 1; 

      Request1_remoteCheck 
      Request1_AddValueLocallyIfRecievedByRemote 

     } finally { 
      m.ReleaseMutex(); 
     } 
    } 

だけ明確にすること、それは本当に問題になることがあります。

「固有の」エラーが大きな問題ではない場合、私はあなたがそれに固執することができると思います。それは退屈かもしれませんが、ミューテックスのリリースを待ってすべてを減速するよりも試して失敗する方が良い場合もあります。

+0

私は重複キー例外のtry/catchを行い、SQLテーブルから既存の値を返します。 – Elisabeth

+0

まあ、私はそれも動作すると思います:) –

関連する問題