我们有一个使用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 :(得分: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();
}
}