首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套事务回滚,尽管为TransactionScopeOption.Suppress

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

Stack Overflow用户
提问于 2012-01-13 20:18:12
回答 2查看 1.7K关注 0票数 4

我想回滚一个名为"scope“的事务,但是名为scope2的内部事务不应该回滚。但它们都会回滚!选项TransactionScopeOption.Suppress不起作用...

我已经启用了DTC,并且我正在使用带有.net 4.0和微软SQl Server2008的Visual Studio2010。这是怎么回事?

代码语言:javascript
复制
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();

            }

        }

非常感谢你的回答!

我终于成功了!

代码语言:javascript
复制
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();

            }

        }

一件奇怪的事情是,当我删除Scripe2.Complete()行,并用scope.Complete()替换//Scripe.Complete();时,我期望得到以下结果:

作用域将被执行scope2将回滚

但实际上:作用域将被执行,scope2也将被执行

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-13 20:24:15

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-01-13 20:24:35

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8850453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档