2011-05-30 69 views
4

當用戶打開某個實體的編輯窗體時,我想鎖定這個實體並讓她做任何更改。在編輯過程中,她需要確保沒有其他人對它進行任何編輯操作。長時間運行實體框架事務

如何鎖定Entity Framework(C#)4+,數據庫MS SQL Server 2008中的實體?

非常感謝你提前!

回答

3

有兩種方式來處理這些情況:

  • 樂觀併發,你允許併發編輯和插入和捕捉異常,如果某些內容侵犯了併發規則。樂觀併發是通過保護相同項目的插入的唯一約束和通過保護對同一項目的併發更新的時間戳/行版本列實施的。如果其他人在當前用戶進行更改時更新行,應用程序在保存期間將拋出OptimisticConcurrencyException,您將不得不允許用戶覆蓋其他更改或重新加載新存儲的數據。

  • 悲觀併發性,其中記錄在任何客戶端執行的操作期間被鎖定,阻止其他客戶端更新相同的記錄。悲觀併發通常通過添加到您的表中的自定義列實施,如LockedBy,LockedAt等。一旦這些列被填充,其他人就不能選擇要編輯的記錄。 LockedAt可以幫助你實現一些發出鎖的自動失效。長時間運行的「EF事務」不是長時間運行的數據庫事務。

您的初始描述會導致第二種情況,這在某些應用中很有意義。

4

糟糕的主意,特別是如果你有很多併發用戶。如果鎖定數據庫中的行,將會導致可伸縮性喪失。

最好是檢測其他人是否進行了編輯,如果是,通知用戶並讓他們決定要做什麼。

timestamp/rowversion數據類型是字段查找是否對行數據進行了更改的不錯選擇。

+0

謝謝。聽起來不錯,我該如何檢測它? – Cartesius00 2011-05-30 20:25:21

+0

@詹姆斯 - 使用'rowversion'。如果試圖更新它與獲取的不同,則行數據已更改。 – Oded 2011-05-30 20:27:00