嵌套事务回滚,尽管TransactionScopeOption.Suppress
本文关键字:TransactionScopeOption Suppress 尽管 嵌套事务 | 更新日期: 2023-09-27 18:20:16
我想回滚名为"scope"的事务,但名为scope2的内部事务不应该回滚。但他们都后退了!!!TransactionScopeOption.Suppress选项不起作用。。。
我已经启用了DTC,并且正在将Visual Studio 2010与.net 4.0和Microsoft SQl Server 2008一起使用。这里怎么了???
using (SqlConnection conn = new SqlConnection(@"Data Source=.'DEVELOPER;Initial Catalog=TestDatenbank;Integrated Security=sspi"))
{
using (TransactionScope scope = new TransactionScope())
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "UPDATE Orders SET ID='111'";
cmd.ExecuteNonQuery();
using (TransactionScope scope2 = new TransactionScope(TransactionScopeOption.Suppress))
{
SqlCommand cmd1 = new SqlCommand();
cmd1.Connection = conn;
cmd1.CommandText = "UPDATE Orders SET OrderName='aaa'";
cmd1.ExecuteNonQuery();
scope2.Complete();
}
//scope.Complete();
}
}
非常感谢你的回答!
我终于工作了!!!!
using (SqlConnection conn = new SqlConnection(@"Data Source=.'DEVELOPER;Initial Catalog=TestDatenbank;Integrated Security=sspi"))
{
using (TransactionScope scope = new TransactionScope())
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "UPDATE Orders SET ID='111'";
cmd.ExecuteNonQuery();
using (SqlConnection conn2 = new SqlConnection(@"Data Source=.'DEVELOPER;Initial Catalog=AdventureWorks;Integrated Security=sspi"))
{
using (TransactionScope scope2 = new TransactionScope(TransactionScopeOption.Suppress))
{
conn2.Open();
SqlCommand cmd1 = new SqlCommand();
cmd1.Connection = conn2;
cmd1.CommandText = "UPDATE Henrik SET ID='111'";
cmd1.ExecuteNonQuery();
scope2.Complete();
}
}
//scope.Complete();
}
}
一件奇怪的事情是,当我删除scope2.Complete()行时;并替换//scope.Complete();具有范围。Complete();我期望以下内容:
范围将被执行scope2将回滚
但实际上:范围将被执行scope2也将执行
有什么想法吗???????
我不确定,但原因可能是,尽管您确实通过使用suppress来抑制任何环境事务,但您使用的连接与外部作用域相同。因此,连接已经参与了事务(外部事务),因此所有更改都绑定到该事务。内部作用域中不存在环境事务这一事实可能不会有什么不同。换句话说,抑制作用域在这里不会起任何作用。
您可以尝试使用RequiresNew
并使用新连接在TransactionScope
中运行内部逻辑。
尝试在单独的连接上创建两个事务作用域。在SQL级别上,事务在每个连接级别上都具有"作用域"。