C# 释放快照连接后,调用链接服务器失败

C# 释放快照连接后,调用链接服务器失败,c#,sql-server,transactions,ado.net,snapshot,C#,Sql Server,Transactions,Ado.net,Snapshot,我们有一个使用ADO.NET的C#应用程序和一个具有快照事务隔离级别的SQL Server。这是“原样”,不幸的是无法修改 现在我们需要在链接服务器上插入内容 我们执行以下代码(简化以说明问题): 在尝试将某些内容插入链接服务器时,可能会出现异常 '事务隔离级别“快照”不支持远程访问' 我想知道为什么不可能:我们打开连接,确保它已被释放(我猜是清除所有事务),并为链接的服务器调用使用第二个连接 使用普通SQL在SSMS中执行这些东西似乎是可行的 我们错过了什么?有合适的方法吗 谢谢你给我正确方向

我们有一个使用ADO.NET的C#应用程序和一个具有快照事务隔离级别的SQL Server。这是“原样”,不幸的是无法修改

现在我们需要在链接服务器上插入内容

我们执行以下代码(简化以说明问题):

在尝试将某些内容插入链接服务器时,可能会出现异常

'事务隔离级别“快照”不支持远程访问'

我想知道为什么不可能:我们打开连接,确保它已被释放(我猜是清除所有事务),并为链接的服务器调用使用第二个连接

使用普通SQL在SSMS中执行这些东西似乎是可行的

我们错过了什么?有合适的方法吗


谢谢你给我正确方向的提示

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

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

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

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

理解这个问题的秘密是“连接池”,它是由ADO.NET在后台完成的。实际连接实际上设置为快照

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

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

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