嵌套事务回滚虽然TransactionScopeOption.Suppress

时间:2012-01-13 12:18:12

标签: c# .net

我想回滚一个名为“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(); with scope.Complete();我期待以下内容:

范围将被执行 scope2将回滚

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

任何想法???????

2 个答案:

答案 0 :(得分:2)

我不确定,但原因可能是虽然您通过使用suppress来抑制任何环境事务,但您使用与外部范围相同的连接。因此,连接已经参与了事务(外部事务),因此所有更改都与此绑定。内部范围中不存在环境事务的事实可能没有区别。换句话说,抑制范围在这里不会做任何事情。

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

答案 1 :(得分:1)

尝试在不同的连接上创建2个事务范围。在SQL级别,事务在每个连接级别“作用域”。