[英]Long running Entity Framework transaction
當用戶打開某個實體的編輯表單時,我想鎖定該實體並讓她進行任何更改。 在編輯期間,她需要確保沒有其他人對其進行任何編輯操作。
如何在 Entity Framework (C#) 4+、數據庫 MS SQL Server 2008 中鎖定實體?
非常感謝您!
壞主意,特別是如果您有許多並發用戶。 如果您鎖定數據庫中的行,您將扼殺可伸縮性。
最好檢測其他人是否進行了編輯,如果是,通知用戶並讓他們決定做什么。
timestamp
/ rowversion
數據類型是一個不錯的選擇,可以讓字段查明是否對行數據進行了任何更改。
有兩種方法可以處理這些情況:
樂觀並發,允許並發編輯和插入,並在某些違反並發規則的情況下捕獲異常。 樂觀並發由保護相同項目的插入的唯一約束和保護對同一項目的並發更新的時間戳/行版本列強制執行。 如果其他人在當前用戶進行更改時更新行,應用程序將在保存期間拋出OptimisticConcurrencyException
,您將不得不允許用戶覆蓋其他更改或重新加載新存儲的數據。
悲觀並發,其中記錄在任何客戶端執行的操作期間被鎖定,阻止其他客戶端更新相同的記錄。 悲觀並發通常由添加到表中的自定義列(如LockedBy
、 LockedAt
等)強制執行。一旦這些列被填充,其他人就無法 select 記錄進行編輯。 LockedAt
可以幫助您實現一些自動過期已發布的鎖。 長時間運行的“EF 事務”不是長時間運行的數據庫事務。
您最初的描述導致第二種情況,這在某些應用程序中是有意義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.