SQL Server错误|快照隔离相关

时间:2016-09-21 23:20:03

标签: sql-server database tsql snapshot isolation-level

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

  

快照隔离事务无法访问数据库' db1'因为此数据库中不允许快照隔离。使用ALTER DATABASE允许快照隔离。

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

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

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

上述查询在100个案例中失败,并出现上述错误消息。

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

欢迎任何建议。

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

1 个答案:

答案 0 :(得分:2)

<强>答案

问题是实体框架重新使用连接池中的连接的方式。让我们以2个查询为例

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

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

当query1执行时,Entity Framework会设置连接(query1执行的连接)以使用快照隔离级别。并且连接保持相同的隔离级别,直到另一个查询显式更改了trasaction范围或连接被回收。请参阅this MSDN文章。

100个案例中有5个,使用相同的连接执行query2,导致使用Isolation Level =&#34; Snapshot&#34;运行query2。由于db1未设置为使用快照隔离,因此收到错误。

要记住一件重要的事情。

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

希望这有助于人们处理类似EF相关的间歇性错误。