2016-09-21 122 views
2

我收到以下錯誤(使用SQL Server 2012)。SQL Server錯誤|快照隔離相關

快照隔離事務訪問數據庫'db1'失敗,因爲此數據庫中不允許快照隔離。使用ALTER DATABASE來允許快照隔離。

這種情況與其他博客的建議不同。我從另一個數據庫(db1)查詢數據庫表(db2.table1)(...使用同義詞)。錯誤查詢的簡化版本如下。

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

DB1有默認的隔離級別(讀提交)和DB2具有隔離級別設置爲快照隔離。

上面的查詢失敗了100個案例中有5個出現上述錯誤消息。

該查詢正在執行使用實體框架6和應用程序中的其他類似查詢的一部分。應用程序依賴於db2進行所有其他操作。

歡迎任何建議。

注意 - >我無法將db1的隔離級別設置爲快照隔離作爲解決方案。

+0

如果不是所有涉及事務的數據庫都允許快照隔離,您希望如何/爲什麼希望'SNAPSHOT'隔離工作? –

+0

就像我提到的一樣,工作100次100次... – ash

+1

db2是否強制實現快照隔離('READ_COMMITTED_SNAPSHOT')或僅僅允許它?如果它強制執行,可能無法可靠地工作。如果它是可選的,你可能手上有[KB972915](https://support.microsoft.com/en-us/kb/972915)之類的東西,儘管這是純粹的猜測,因爲我不知道如何英孚處理這種情況。 –

回答

2

回答

的問題是這樣的連接池中的實體框架重新使用的連接。讓我們的例子中的2查詢

  • QUERY1(一個查詢,被設置TrasactionScope到快照隔離)

  • QUERY2

(表示如上所定義的跨數據庫查詢的查詢)

當query1執行時,實體框架將連接(在哪個query1下執行)設置爲使用快照隔離級別。直到另一個查詢顯式地改變了傳輸範圍或連接被回收爲止,相同的隔離級別仍然保留在連接中。請參閱this MSDN文章。

在100個案例中有5個,使用相同的連接執行query2,導致運行query2和Isolation Level =「Snapshot」。由於db1未設置爲使用快照隔離,因此收到了該錯誤。

要記住一件重要的事情。

  • 當實體框架重用從連接池的連接,它不重置連接對象的隔離級別。爲了強制爲上下文使用特定的隔離級別,您需要明確地設置它。

希望這可以幫助處理類似EF的人處理間歇性錯誤。