我正在学习与EF4.0一起使用的并发性,并对使用的锁定模式有疑问。我对编程一般都很陌生,特别是并发,所以也许我说错了...请跟我一起玩。
假设我在版本号属性上配置了一个固定的并发模式。
现在说我从数据库(上下文)获取记录(实体)并编辑一些属性。版本增加,并在其上下文中调用SaveChanges时。如果当前数据库(上下文)版本与原始记录(实体)的版本匹配,则保存继续,否则EF将抛出OptimisticConcurrencyException。
现在,我的兴趣点如下:在版本检查之间总是会有一小段时间,无论多小,它都存在。所以理论上其他人可能只是更新了比较和实际保存之间的记录,因此可能会破坏数据。
这是如何解决的?感觉问题就好像被推进了一样。
答案 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处理这种情况的方式因为我没有检查过自己,但是,当然如果你要去自己动手,这是一种方法。