4

異なるアプリケーションから、同じデータベースをEntity Frameworkを使用して呼び出しています。しかし、あるアプリケーションがレコードの読み取り/更新を行っているときに、他のアプリケーションがそのデータを読み取ることは望ましくありません。Entity Framework - レコードのロックを読み取る

次のサンプルコードで試しました。しかし、彼らはまだレコードを読むことができます。

どのような提案や異なるアプローチが高く評価されます!

using (Entities context = new Entities(ConnectionString)) 
{ 
    DBTable entity; 

    do 
    { 
     entity = context.DBTable 
      .Where(item => item.IsLock == false) 
      .FirstOrDefault(); 

     if (entity != null) 
     { 
      // Map entity to class 
      ...... 


      // Lock the record; it will be unlocked later by a calling method. 
      entity.IsLock = true; 
      context.SaveChanges(); 

      count++; 
     } 

    } while (entity != null && count < 100); 
} 

編集:基本的に、私はレコードを読み、何かをする(時には時間がかかる)。その後、成功/失敗フラグでレコードを更新します(他のレコードに失敗した場合は、再度それを実行できます)。私は他のアプリケーションが成功タスクを何度もやりたいとは思わない。答えにコメントから移動

+0

編集中にレコードをロックする場合は、dBaseを検討してください。あなたのaproachが本当に必要かどうかをよく確認してください。通常の方法ではありません。 –

+0

長時間実行されていない場合は、TransactionScopeを使用できます。 – Jeff

+0

これは、あなたがデータベース/トランザクションロックを使いたいと思うようなものではありません。問題のテーブルに列を追加することをお勧めします - IsLocked、必要に応じて更新してください。ただし、プロセスがレコードをロックしてプロセスが何らかの形で終了した場合はどうなりますか?これに対処するには、ロック(ロックID、プロセスID、有効期限)を追跡し、ロックしていないレコードにロックIDを追加する2番目のテーブルを考えてみましょう。 – Smudge202

答えて

5

:あなたはSQLでこれを固定してもかまわない場合

、ストアドプロシージャを作成します。ストアドプロシージャでは、WITH UPDLOCK(see here for information on table hints)レコードでSELECTを実行します。 SELECTの後、レコードをIsLockに更新します。これにより、IsLockフィールドをチェック/設定している間に他のプロセスがデータを読み取ることができなくなります。

希望します。

関連する問題