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