2016-03-31 10 views
0

SQL Server 2014に対してEntity Framework 6を​​使用すると、StatusIdが1の処理対象項目のリストが取得されます。各項目が処理されると、ステータスが2それは再び処理されません。処理には数分かかることがあります。キュー項目が2回処理されないようにする方法

しかし、これはいわゆる「スレッドセーフ」ではありません。言い換えれば、最初のコードが完了する前にコードが再度開始された場合(つまり別のプロセスによって)、アイテムのステータスは1のままなので、再びキューに入り、2回目の処理が行われます。

レコードを処理するようにするには、どうすればよいのですか。レコードが2度目に取り出されないようにするにはどうすればよいですか?たとえば、トランザクション内のデータを取得してステータスを更新することは可能ですか?

+5

。 – entropic

+0

'lock'や' DbContext.Database.BeginTransaction() 'ですか? –

+1

@entropic私はその考えをトランザクションと組み合わせて好きです。 –

答えて

1

lockステートメント内にEF transactionをラップして、1つのスレッドのみがいつでも処理ロジックにアクセスできるようにすることができます。

ロックキーワードは によってクリティカルセクションは、指定されたオブジェクトの相互排他ロックを取得 文を実行し、その後ロックを解除するように命令ブロックをマークします。第三ステータスが「処理」を作成し、一回の作業が始まることに設定されていないのはなぜ

private void ProcessEntities(IEnumerable<Entity> entities) 
{ 
    lock (processLock) 
    { 
     using (var transaction = SomeDbContext.Database.BeginTransaction()) 
     { 
      try 
      { 
       // process... 
       // ... 
       SomeDbContext.SaveChanges(); 
       transaction.Commit(); 
      } 
      catch (Exception e) 
      { 
       transaction.Rollback(); 
       Log(e); 
       throw; 
      } 
     } 
    } 
} 
関連する問題