1

基於一些週期性併發傳入的數據,我正在執行一個操作,該操作會將新行插入表中,或者更新同一個表中的現有行。它是插入還是更新行取決於現有行的狀態。因此,此操作的結果將受此操作的先前運行的影響,並影響後續運行。我需要使用事務或鎖定或其他方法確保原子性/隔離性。 Entity Framework似乎有很多選擇和注意事項(我也是一個全面的數據庫資源的新手),我不知道我應該朝哪個方向前進。 TransactionScope,BeginTransaction,環境事務? Serializable或RepeatableRead? SaveChanges和AcceptAllChanges?我甚至需要做特別的事情嗎?可以添加新行的事實使我特別擔心幻影行,儘管我幾乎不明白這意味着什麼。任何關於這個問題的指導將不勝感激。實體框架中的併發,原子和隔離

回答

1

本教程可能對你有幫助 - http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application

報價:

悲觀併發(鎖定)

如果您的應用程序確實需要防止 併發場景數據的意外丟失,一種方法是使用數據庫鎖。 這被稱爲悲觀併發。例如,在從數據庫中讀取 行之前,您請求鎖定爲只讀或更新 訪問。如果您鎖定一行以進行更新訪問,則不允許其他用戶鎖定該行以進行只讀或更新訪問,因爲 他們將獲得正在更改過程中的數據的副本。 如果您將一行鎖定爲只讀訪問權限,其他人也可以將其鎖定爲 只讀訪問權限,但不能用於更新。管理鎖具有一些缺點。編程可能很複雜。它需要大量的數據庫管理資源,並且隨着應用程序用戶數量的增加(即,其 不能很好地擴展),會導致性能問題 。由於這些原因,並不是所有的數據庫管理系統都支持悲觀併發。實體框架提供了 沒有內置的支持,本教程不會告訴你如何執行它 。

樂觀併發

的替代悲觀併發是樂觀併發。 樂觀併發意味着允許發生併發衝突, 然後在適當的情況下做出適當的反應。例如,John運行 「部門編輯」頁面,將英文 部門的預算金額從$ 350,000.00更改爲$ 100,000.00。 (約翰·管理一個 競爭的部門,要騰出資金用於自己的 部門。)*

有在本教程中這兩種模式的代碼示例。