4

我使用實體框架從不同的應用程序調用相同的數據庫。但是,當一個應用程序正在讀取/更新記錄時,我不希望其他應用程序讀取該數據。實體框架 - 在記錄中讀取鎖定

我試着用下面的示例代碼;但是,他們仍然能夠讀取記錄。

任何建議或不同的方法將不勝感激!

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。更好地檢查你的方法是否真的有必要,這不是正常的做法。 –

+0

如果運行時間不長,可以使用TransactionScope。 – Jeff

+0

這聽起來不像你想使用數據庫/事務鎖的那種 - 「」(它有時需要很長時間)「」。我建議你在問題表中添加一列 - IsLocked,並根據需要進行更新。儘管(如果某個進程鎖定了一條記錄,然後終止了該進程,那麼可能會需要更復雜的)。爲了解決這個問題,考慮第二張表,記錄您的鎖(鎖定ID,進程ID,到期日期),然後將鎖定ID添加到您想保持不變的記錄中? – Smudge202

回答

5

從註釋移到一個答案:

如果你不介意與SQL修復此,創建一個存儲過程。在存儲過程中,在WITH UPDLOCK記錄(see here for information on table hints)上執行SELECT操作。在SELECT之後,將記錄更新爲IsLock。這可以防止任何其他進程在檢查/設置IsLock字段時讀取數據。

希望可以幫到