2017-08-28 70 views
-1

我有多個服務使用相同的表,我想鎖定表使用EF,如果某些服務已經在使用它。EF可以鎖表嗎?

我嘗試用以下解決方案的幫助下做到這一點,但它不工作

How can I lock a table on read, using Entity Framework?

欲瞭解更多信息

我嘗試使用從「服務1」這個代碼在同時我使用「服務2」 調用相同的功能,但它仍然從表中檢索數據。

**我想要「服務1」調用函數,然後表有鎖,「服務2」無法檢索數據或做任何事情都可以這樣嗎?

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead })) 
{ 
     var newUrl = dbEntity.URLs.FirstOrDefault(url => url.StatusID == (int) URLStatus.New); 
     if(newUrl != null) 
     { 
      newUrl.StatusID = (int) URLStatus.InProcess; 
      dbEntity.SaveChanges(); 
     } 

     scope.Complete(); 
} 
+1

問題尋求幫助調試(「爲什麼不是這個代碼的工作?」)必須包括所期望的行爲,一個特定的問題或錯誤的和必要的最短的代碼在問題本身中重現它。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建最小,完整和可驗證示例。 – TheGameiswar

+0

謝謝。我會添加更多信息。 – Witchayanin

回答

0

沒有事務隔離級別。最簡單的方法是使用Application Lock。應用程序鎖就像一個全局互斥體,它只允許一臺客戶機運行一段代碼。請注意,此代碼不一定是數據庫代碼。您可以使用應用程序鎖定爲客戶端提供對文件或其他資源的獨佔訪問權限。

像這樣:

using (var tran = db.Database.BeginTransaction(System.Data.IsolationLevel.ReadCommitted)) 
{ 
    var lockName = "MyLock"; 
    db.Database.ExecuteSqlCommand($"exec sp_getapplock '{lockName}', 'exclusive'"); 

    // do stuff 

    tran.Commit(); 
} 
相關問題