2017-02-14 81 views
1

我們有一個使用ADO.NET的C#應用​​程序和一個具有SNAPSHOT事務隔離級別的SQL Server。這是'原樣',不幸的是不能修改。在處理快照連接後調用鏈接的服務器失敗

現在我們需要在鏈接的服務器上插入東西。

我們執行以下代碼(減少來說明問題):

// Create a snapshot Transaction and close the connection 
using (var con = new SqlConnection(myConStr)) 
{ 
    con.BeginTransaction(TransactionLevel.Snapshot); 
} 

// do something with a linked server 
using (var con = new SqlConnection(myConStr)) 
{ 
    using (var cmd = con.CreateCommand() 
    { 
    cmd.CommandText = "insert into LinkedServer.SomeDb..Table ..."; 
    cmd.ExecuteNonQuery(); 
    } 
} 

我們得到可以試圖插入一些內容鏈接服務器

「遠程訪問不支持事務處理時異常隔離級別「SNAPSHOT」'

我想知道爲什麼它是不可能的:我們打開連接,確保它被丟棄(清除所有事務,我猜),並使用第二個連接進行鏈接服務器調用。

使用普通SQL執行SSMS中的東西似乎工作。

我們有什麼缺失?有沒有適當的方法來做到這一點?

感謝您的正確方向提示。

回答

0

理解問題的祕訣在於ADO.NET在後臺完成的「連接池」。真正的連接實際上設置爲SNAPSHOT。

在示例代碼的第二部分,該連接只是被重用,因此仍處於「快照模式」。

解決方案是在打開連接之後,將事務隔離級別顯式設置爲其他值。

using (var con = new SqlConnection(myConStr)) 
{ 
    using (var cmd = con.CreateCommand() 
    { 
    cmd.CommandText = "set transaction isolation Level read committed"; 
    cmd.ExecuteNonQuery(); 
    } 

    using (var cmd = con.CreateCommand() 
    { 
    cmd.CommandText = "insert into LinkedServer.SomeDb..Table ..."; 
    cmd.ExecuteNonQuery(); 
    } 
}