2017-02-14 78 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(); 
    } 
}