嵌套事务回滚,尽管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也将执行

有什么想法吗???????

嵌套事务回滚,尽管TransactionScopeOption.Suppress

我不确定,但原因可能是,尽管您确实通过使用suppress来抑制任何环境事务,但您使用的连接与外部作用域相同。因此,连接已经参与了事务(外部事务),因此所有更改都绑定到该事务。内部作用域中不存在环境事务这一事实可能不会有什么不同。换句话说,抑制作用域在这里不会起任何作用。

您可以尝试使用RequiresNew并使用新连接在TransactionScope中运行内部逻辑。

尝试在单独的连接上创建两个事务作用域。在SQL级别上,事务在每个连接级别上都具有"作用域"。

相关文章:
  • 没有找到相关文章