【问题标题】:nested Transaction rolls back although TransactionScopeOption.Suppress尽管 TransactionScopeOption.Suppress 嵌套事务回滚
【发布时间】:2012-01-13 21:00:55
【问题描述】:

我想回滚名为“scope”的事务,但名为 scope2 的内部事务不应回滚。但是他们都回滚了!!! TransactionScopeOption.Suppress 选项不起作用...

我已经启用了 DTC,并且正在使用带有 .net 4.0 和 Microsoft SQl Server 2008 的 Visual Studio 2010。 怎么了???

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();与范围。完成();我期待以下内容:

范围将被执行 scope2 将回滚

但实际上: 范围将被执行 scope2 也会被执行

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

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    我不确定,但原因可能是尽管您确实通过使用抑制来抑制任何环境事务,但您使用与外部作用域相同的连接。因此,连接已经参与了事务(外部事务),因此所有更改都与此相关。内部范围中不存在环境事务这一事实可能不会产生影响。换句话说,抑制作用域在这里不会做任何事情。

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

    【讨论】:

      【解决方案2】:

      尝试在单独的连接上创建 2 个事务范围。在 SQL 级别,事务是在每个连接级别“限定”的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-11
        • 2012-09-14
        相关资源
        最近更新 更多