我听说SQL Server SELECT statements causing blocking。
所以我有EF和SQL Server 2008的MVC应用程序,它与另一个经常写入一些数据的应用程序共享数据库。 MVC应用程序根据来自其他应用程序的数据生成一些实时报告。
所以考虑到这种情况是否有可能在生成报告时阻止某些表,而另一个应用程序将尝试写入数据?
我尝试在生成报告时进行一些手动插入和更新,并且处理得很好。我误解了什么吗?
答案 0 :(得分:4)
这是为什么在Sql Server的Entity Framework 6中database creation has changed的默认值的原因之一:
EF现在与SQL Server数据库的“最佳实践”保持一致,即将数据库的READ_COMMITTED_SNAPSHOT设置配置为ON。这意味着,默认情况下,每次进行更改时,数据库都会创建自身的快照。在对实际数据库执行更新时,将对快照执行查询。
因此,对于由EF 5及更低版本创建的数据库,READ_COMMITTED_SNAPSHOT
为OFF
which means that
数据库引擎使用共享锁来防止其他事务在当前事务运行读操作时修改行。
当然,您可以随时更改设置:
ALTER DATABASE MyDb SET READ_COMMITTED_SNAPSHOT ON
答案 1 :(得分:0)
READ UNCOMMITTED应该有所帮助,因为它不会对正在检索的数据发出共享锁。因此,它不会打扰您的其他应用程序密集更新数据。另一种选择是在长时间运行的SELECT上使用SNAPSHOT隔离。此方法可保留所选数据的数据完整性,但需要更高CPU的成本和更强的tempdb使用率。