使用固定的concurrencymode保存之前锁定

时间:2011-08-09 13:31:45

标签: entity-framework-4 concurrency

我正在学习与EF4.0一起使用的并发性,并对使用的锁定模式有疑问。我对编程一般都很陌生,特别是并发,所以也许我说错了...请跟我一起玩。

假设我在版本号属性上配置了一个固定的并发模式。

现在说我从数据库(上下文)获取记录(实体)并编辑一些属性。版本增加,并在其上下文中调用SaveChanges时。如果当前数据库(上下文)版本与原始记录(实体)的版本匹配,则保存继续,否则EF将抛出OptimisticConcurrencyException。

现在,我的兴趣点如下:在版本检查之间总是会有一小段时间,无论多小,它都存在。所以理论上其他人可能只是更新了比较和实际保存之间的记录,因此可能会破坏数据。

这是如何解决的?感觉问题就好像被推进了一样。

2 个答案:

答案 0 :(得分:1)

检查版本和更新记录之间没有一段时间,因为数据库命令如下所示:

UPDATE SomeTable
SET SomeColumn = 'SomeValue'
WHERE Id = @Id AND Version = @OldVersion

SELECT @@ROWCOUNT 

检查和更新是一个原子操作。如果没有Id = @Id and Version = @OldVersion的记录存在且该零被转换为异常,则Rowcount将返回0。

答案 1 :(得分:0)

这可以(也可能)使用locking hints解决。

对于SQL Server,EF可以从数据库WITH UPDLOCK查询(SELECT)。

这告诉数据库引擎,您想要读取多个记录,其他任何人都无法更改这些记录,直到您之后执行更新。

如果您想亲眼看到这一点,请查看Sql Server Profiler,它会实时显示您的问题。

希望有所帮助。

CAVEAT :我不能肯定这个与EF处理这种情况的方式因为我没有检查过自己,但是,当然如果你要去自己动手,这是一种方法。