我收到以下错误(使用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的隔离级别设置为快照隔离作为解决方案。
答案 0 :(得分:2)
<强>答案强>
问题是实体框架重新使用连接池中的连接的方式。让我们以2个查询为例
query1(将TrasactionScope设置为快照隔离的查询)
query2(表示上面定义的跨数据库查询的查询)
当query1执行时,Entity Framework会设置连接(query1执行的连接)以使用快照隔离级别。并且连接保持相同的隔离级别,直到另一个查询显式更改了trasaction范围或连接被回收。请参阅this MSDN文章。
100个案例中有5个,使用相同的连接执行query2,导致使用Isolation Level =&#34; Snapshot&#34;运行query2。由于db1未设置为使用快照隔离,因此收到错误。
要记住一件重要的事情。
希望这有助于人们处理类似EF相关的间歇性错误。