2011-05-30 72 views
4

当用户打开某个实体的编辑窗体时,我想锁定这个实体并让她做任何更改。在编辑过程中,她需要确保没有其他人对它进行任何编辑操作。长时间运行实体框架事务

如何锁定Entity Framework(C#)4+,数据库MS SQL Server 2008中的实体?

非常感谢你提前!

回答

3

有两种方式来处理这些情况:

  • 乐观并发,你允许并发编辑和插入和捕捉异常,如果某些内容侵犯了并发规则。乐观并发是通过保护相同项目的插入的唯一约束和通过保护对同一项目的并发更新的时间戳/行版本列实施的。如果其他人在当前用户进行更改时更新行,应用程序在保存期间将抛出OptimisticConcurrencyException,您将不得不允许用户覆盖其他更改或重新加载新存储的数据。

  • 悲观并发性,其中记录在任何客户端执行的操作期间被锁定,阻止其他客户端更新相同的记录。悲观并发通常通过添加到您的表中的自定义列实施,如LockedBy,LockedAt等。一旦这些列被填充,其他人就不能选择要编辑的记录。 LockedAt可以帮助你实现一些发出锁的自动失效。长时间运行的“EF事务”不是长时间运行的数据库事务。

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

4

糟糕的主意,特别是如果你有很多并发用户。如果锁定数据库中的行,将会导致可伸缩性丧失。

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

timestamp/rowversion数据类型是字段查找是否对行数据进行了更改的不错选择。

+0

谢谢。听起来不错,我该如何检测它? – Cartesius00 2011-05-30 20:25:21

+0

@詹姆斯 - 使用'rowversion'。如果试图更新它与获取的不同,则行数据已更改。 – Oded 2011-05-30 20:27:00