【问题标题】:Can entity framework select block the table?实体框架select可以屏蔽表吗?
【发布时间】:2014-03-12 05:17:59
【问题描述】:

我听说SQL Server SELECT statements causing blocking

所以我有 EF 和 SQL Server 2008 的 MVC 应用程序,它与另一个经常写入一些数据的应用程序共享数据库。 MVC 应用程序会根据来自另一个应用程序的数据生成一些实时报告。

那么在这种情况下,是否有可能在生成报告时阻止其他应用程序尝试写入数据的某些表?

我尝试在生成报告时进行一些手动插入和更新,并且处理得很好。我误解了什么吗?

【问题讨论】:

  • 无论实体框架如何,SQL Server 都需要设置 ISOLATION LEVEL,我在我的 SP 中有 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 用于从也有大量写入的表中读取记录。我不确定实体框架如何实现同样的效果......
  • @Habib 我不关心 EF 端的读取,我关心的是另一个应用程序中的写入
  • 一个 SELECT 会导致阻塞,EF 也会为 SQL Server 生成一个 SELECT 语句,如果你的读取花费了太多时间,那么肯定会发生阻塞。
  • @Habib 我不介意 SELECT 是否会被阻止。我想避免阻止更新/插入。看起来 READ UNCOMMITTED 可以避免 SELECT 块,但不能避免 INSERT/UPDATE

标签: sql sql-server performance entity-framework blocking


【解决方案1】:

这是在 Entity Framework 6 for Sql Server 中默认 database creation has changed 的原因之一:

EF 现在与 SQL Server 数据库的“最佳实践”保持一致,即将数据库的 READ_COMMITTED_SNAPSHOT 设置配置为 ON。这意味着,默认情况下,每次进行更改时,数据库都会创建自己的快照。查询将在快照上执行,而在实际数据库上执行更新。

所以对于由 EF 5 及更低版本创建的数据库,READ_COMMITTED_SNAPSHOTOFF which means that

数据库引擎使用共享锁来防止其他事务在当前事务正在运行读取操作时修改行。

当然,您可以随时自行更改设置:

ALTER DATABASE MyDb SET READ_COMMITTED_SNAPSHOT ON

【讨论】:

    【解决方案2】:

    READ UNCOMMITTED 应该会有所帮助,因为它不会对正在检索的数据发出共享锁。因此,它不会打扰您密集更新数据的其他应用程序。另一种选择是在长时间运行的 SELECT 上使用 SNAPSHOT 隔离。这种方法保留了选定数据的数据完整性,但代价是更高的 CPU 和更密集的 tempdb 使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      相关资源
      最近更新 更多