当用户打开某个实体的编辑表单时,我希望锁定该实体并让其进行任何更改。在编辑过程中,她需要确保没有其他人对其进行任何编辑操作。
如何在Entity Framework(C#)4+,数据库MS SQL Server 2008中锁定实体?
非常感谢您的提前帮助!
如何在Entity Framework(C#)4+,数据库MS SQL Server 2008中锁定实体?
非常感谢您的提前帮助!
这是一个不好的想法,特别是如果你有很多并发用户。如果在数据库中锁定行,将会破坏可扩展性。
更好的做法是检测其他用户是否进行了编辑,如果是,则通知用户并让他们决定如何处理。
timestamp
/rowversion
数据类型是一个很好的选择,用于查找行数据是否有任何更改。
乐观并发,允许并发编辑和插入,并在违反并发规则时捕获异常。 乐观并发是通过保护相同项目的插入的唯一约束和时间戳/行版本列来实现的,以保护对同一项目的并发更新。如果其他人在当前用户进行更改时更新行,则应用程序将在保存期间抛出 OptimisticConcurrencyException
,您必须允许用户覆盖其他更改或重新加载新存储的数据。
悲观并发,记录在执行任何客户端操作期间被锁定,防止其他客户端更新相同的记录。悲观并发通常通过添加到表格中的自定义列(例如LockedBy
,LockedAt
等)来实现。一旦填写了这些列,没有其他人可以选择该记录进行编辑。LockedAt
可以帮助您实现一些已发出锁定的自动过期。长时间运行的“EF事务”不是长时间运行的数据库事务。
rowversion
。如果在尝试更新时与您获取的版本不同,则行数据已更改。 - Oded