【发布时间】:2011-05-30 20:20:37
【问题描述】:
当用户打开某个实体的编辑表单时,我想锁定该实体并让她进行任何更改。在编辑期间,她需要确保没有其他人对其进行任何编辑操作。
如何在 Entity Framework (C#) 4+、数据库 MS SQL Server 2008 中锁定实体?
非常感谢您!
【问题讨论】:
标签: c# .net entity-framework sql-server-2008 transactions
当用户打开某个实体的编辑表单时,我想锁定该实体并让她进行任何更改。在编辑期间,她需要确保没有其他人对其进行任何编辑操作。
如何在 Entity Framework (C#) 4+、数据库 MS SQL Server 2008 中锁定实体?
非常感谢您!
【问题讨论】:
标签: c# .net entity-framework sql-server-2008 transactions
坏主意,特别是如果您有很多并发用户。如果您锁定数据库中的行,您将扼杀可伸缩性。
最好检测其他人是否进行了编辑,如果是,通知用户并让他们决定做什么。
timestamp/rowversion 数据类型是一个不错的选择,可以让字段查明是否对行数据进行了任何更改。
【讨论】:
rowversion。如果在尝试更新时它与您获取的不同,则行数据已更改。
有两种方法可以处理这些情况:
乐观并发,允许并发编辑和插入,并在某些违反并发规则的情况下捕获异常。乐观并发由保护相同项目的插入的唯一约束和保护对同一项目的并发更新的时间戳/行版本列强制执行。如果其他人在当前用户进行更改时更新行,则应用程序将在保存期间抛出OptimisticConcurrencyException,您必须允许用户覆盖其他更改或重新加载新存储的数据。
悲观并发,其中记录在任何客户端执行的操作期间被锁定,阻止其他客户端更新同一记录。悲观并发通常由添加到表中的自定义列(如LockedBy、LockedAt 等)强制执行。一旦这些列被填充,其他人就无法选择要编辑的记录。 LockedAt 可以帮助你实现一些自动过期的已发行锁。长时间运行的“EF 事务”不是长时间运行的数据库事务。
您最初的描述导致了第二种情况,这在某些应用程序中是有意义的。
【讨论】: