2011-08-09 33 views
0

我正在學習有關使用EF4.0的併發性問題,並對使用的鎖定模式有疑問。我在編程方面相對比較新,特別是併發性,所以我可能會說錯話......請和我一起裸照。使用固定併發模式保存之前鎖定

假設我在版本號屬性上配置了固定併發模式。

現在說我從數據庫(上下文)獲取記錄(實體)並編輯一些屬性。在其上下文中調用SaveChanges時,版本會增加。如果當前數據庫(上下文)版本與原始記錄(實體)的版本相匹配,則保存將繼續,否則由EF引發OptimisticConcurrencyException。

現在,我的興趣點如下:在版本檢查之間總是有一小段時間,無論小小,它都在那裏。所以理論上,其他人可能只是更新了比較和實際保存之間的記錄,因此可能會破壞數據。

這是怎麼解決的?這感覺就好像問題剛剛被推進。

回答

1

有檢查版本和更新記錄之間不存在一段時間,因爲數據庫命令看起來像:

UPDATE SomeTable 
SET SomeColumn = 'SomeValue' 
WHERE Id = @Id AND Version = @OldVersion 

SELECT @@ROWCOUNT 

的檢查和更新是一個原子操作。如果沒有存在Id = @Id and Version = @OldVersion的記錄並且零被轉換爲異常,則行計數將返回0。

+0

啊,是的,這是有道理的。真正的答案是,我應該剖析我的疑問:) – duress

0

這可以(也可能是)使用locking hints解決。

對於SQL Server,EF可以從數據庫WITH UPDLOCK查詢(SELECT)。

這告訴數據庫引擎,您要讀取一個/多個記錄,並且其他人無法更改這些記錄,直到此後執行更新。

如果您想自己查看,請查看Sql Server Profiler,它將實時向您顯示查詢。

希望有所幫助。

CAVEAT:我不能肯定地說,這是因爲我沒有檢查自己,但是,當然,如果你要自己做EF處理這種情況的方式,這是一個辦法做到這一點。