长时间运行的Entity Framework事务

4
当用户打开某个实体的编辑表单时,我希望锁定该实体并让其进行任何更改。在编辑过程中,她需要确保没有其他人对其进行任何编辑操作。
如何在Entity Framework(C#)4+,数据库MS SQL Server 2008中锁定实体?
非常感谢您的提前帮助!
2个回答

4

这是一个不好的想法,特别是如果你有很多并发用户。如果在数据库中锁定行,将会破坏可扩展性。

更好的做法是检测其他用户是否进行了编辑,如果是,则通知用户并让他们决定如何处理。

timestamp/rowversion 数据类型是一个很好的选择,用于查找行数据是否有任何更改。


@James - 使用 rowversion。如果在尝试更新时与您获取的版本不同,则行数据已更改。 - Oded

3
处理这些情况有两种方法:
  • 乐观并发,允许并发编辑和插入,并在违反并发规则时捕获异常。 乐观并发是通过保护相同项目的插入的唯一约束和时间戳/行版本列来实现的,以保护对同一项目的并发更新。如果其他人在当前用户进行更改时更新行,则应用程序将在保存期间抛出 OptimisticConcurrencyException,您必须允许用户覆盖其他更改或重新加载新存储的数据。

  • 悲观并发,记录在执行任何客户端操作期间被锁定,防止其他客户端更新相同的记录。悲观并发通常通过添加到表格中的自定义列(例如LockedByLockedAt等)来实现。一旦填写了这些列,没有其他人可以选择该记录进行编辑。LockedAt可以帮助您实现一些已发出锁定的自动过期。长时间运行的“EF事务”不是长时间运行的数据库事务。

您最初的描述导致第二种方案,在某些应用程序中是有意义的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接