c# - 尽管 TransactionScopeOption.Suppress 嵌套事务回滚

标签 c# .net

我想回滚名为“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也会被执行

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

最佳答案

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

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

关于c# - 尽管 TransactionScopeOption.Suppress 嵌套事务回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8850453/

相关文章:

c# - 更改 Windows 应用商店应用程序的标题文本

c# - 默认情况下,CLR 会重用 LOH 中的对象吗?

c# - 将 bool[] 转换为 byte[]

c# - 抽象出复合标识值以用于业务逻辑?

c# - 这是不推荐使用的编码方式吗? ASP.Net MVC

c# - 手动编码解析器

.net - Rx for .NET - Scheduler.Dispatcher 发生了什么?

c# - 检查 Windows keystore 中是否安装了最终用户证书?

c# - 基于云pubsub运行c#示例项目时的依赖问题

C# Concurent 字典 - 锁定值