处理快照连接后,调用链接服务器失败

时间:2017-02-14 14:33:31

标签: c# sql-server transactions ado.net snapshot

我们有一个使用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中执行这些东西似乎有效。

我们缺少什么?有没有正确的方法呢?

感谢您提供正确方向的任何提示。

1 个答案:

答案 0 :(得分:0)

理解这个问题的秘诀是ADO.NET在后台完成的“连接池”。实际连接实际上设置为SNAPSHOT。

在示例代码的第二部分中,该连接只是被重用,因此仍处于“快照模式”。

解决方案是在打开Connection后立即将事务隔离级别显式设置为其他内容。

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();
  }
}