当用户打开某个实体的编辑表单时,我想锁定此实体并让她进行任何更改。在编辑过程中,她需要确保没有其他人对其进行任何编辑操作。
如何在实体框架(C#)4 +,数据库MS SQL Server 2008中锁定实体?
提前非常感谢你!
答案 0 :(得分:4)
糟糕的主意,特别是如果你有很多并发用户。如果锁定数据库中的行,将会破坏可伸缩性。
最好检测其他人是否进行了编辑,如果是,请通知用户并让他们决定要做什么。
timestamp
/ rowversion
数据类型是字段查看是否对行数据进行任何更改的不错选择。
答案 1 :(得分:3)
有两种方法可以处理这些情况:
乐观并发,允许并发编辑和插入,并在违反并发规则的情况下捕获异常。乐观并发通过保护相同项的插入的唯一约束以及保护对同一项的并发更新的时间戳/行版本列来实施。如果其他人在当前用户进行更改时更新了行,则应用程序将在保存期间抛出OptimisticConcurrencyException
,您必须允许用户覆盖其他更改或重新加载新存储的数据。
悲观并发,其中记录在任何客户端执行的操作期间被锁定,阻止其他客户端更新同一记录。悲观并发通常由添加到表中的自定义列强制执行,如LockedBy
,LockedAt
等。一旦填充了这些列,其他任何人都无法选择要编辑的记录。 LockedAt
可以帮助您实现已发布锁的自动过期。长时间运行的“EF事务”不会长时间运行数据库事务。
您的初步描述会导致第二种情况在某些应用程序中有意义。