长时间运行的Entity Framework事务

当用户打开某个实体的编辑表单时,我想锁定该实体并让她进行任何更改。 在编辑过程中,她需要确保没有其他人对其进行任何编辑操作。

如何在entity framework(C#)4 +,数据库MS SQL Server 2008中锁定实体?

非常感谢你提前!

有两种方法可以处理这些情况:

  • 乐观并发,允许并发编辑和插入,并在违反并发规则的情况下捕获exception。 乐观并发是通过保护相同项的插入的唯一约束以及保护同一项的并发更新的时间戳/行版本列来实施的。 如果当前用户进行更改时其他人更新了行,则应用程序将在保存期间抛出OptimisticConcurrencyException ,您必须允许用户覆盖其他更改或重新加载新存储的数据。

  • 悲观并发,其中记录在任何客户端执行的操作期间被锁定,阻止其他客户端更新同一记录。 悲观并发通常由添加到表中的自定义列强制执行,如LockedByLockedAt等。一旦填充了这些列,其他任何人都无法选择要编辑的记录。 LockedAt可以帮助您实现已发布锁的自动过期。 长时间运行的“EF事务”不会长时间运行数据库事务。

您的初始描述会导致第二种情况在某些应用程序中有意义。

不好的主意,特别是如果你有很多并发用户。 如果锁定数据库中的行,则会破坏可伸缩性。

最好检测其他人是否进行了编辑,如果是,请通知用户并让他们决定做什么。

对于字段来说, timestamp /行转换数据类型是一个很好的选择,可以找出是否对行数据进行了任何更改。