SQL 服务器错误 |快照隔离相关

SQL Server error | Snapshot Isolation related

我收到以下错误(使用 SQL Server 2012)。

Snapshot isolation transaction failed accessing database 'db1' because snapshot isolation is not allowed in this database. Use ALTER DATABASE to allow snapshot isolation.

这种情况与其他博客所暗示的不同。我正在从另一个数据库 (db1) 查询数据库 table (db2.table1)(...使用同义词)。错误查询的简化版本如下。

select col1, col2 
from db1.tab1 t 
inner join db2.table1
where xyz = 'abc'

db1 具有默认隔离级别(已提交读),db2 具有设置为快照隔离的隔离级别。

上述查询在 100 例中有 5 例失败并出现上述错误消息。

此查询正在使用 Entity Framework 6 和应用程序中其他类似查询的一部分执行。应用程序依赖于 db2 进行所有其他操作。

欢迎提出任何建议。

注意 --> 我无法将 db1 的隔离级别设置为快照隔离作为解决方案。

回答

问题在于 Entity Framework 重新使用连接池中的连接的方式。让我们以 2 个查询为例

  • query1(将 TrasactionScope 设置为快照隔离的查询)

  • query2(表示上面定义的跨数据库查询的查询)

当 query1 执行时,Entity Framework 将连接(query1 在其下执行)设置为使用快照隔离级别。在另一个查询显式更改事务范围或连接被回收之前,连接将保持相同的隔离级别。请参阅 this MSDN 文章。

100 例中有 5 例使用相同的连接来执行 query2,这导致 运行 query2 的隔离级别 = "Snapshot"。由于 db1 未设置为使用快照隔离,因此收到错误。

记住一件重要的事情。

  • 当Entity Framework重用连接池中的连接时,它不会重置连接对象的隔离级别。为了强制对上下文使用特定的隔离级别,您需要明确设置它。

希望这可以帮助人们处理与 EF 相关的类似间歇性错误。