首页 > 解决方案 > 当我停止调试器时,C# TransactionScope 不回滚

问题描述

我在我的控制器、ASP Net 4.6 和 SQL Server 2014 的运行时中有这个简单的代码可以正常工作,但是当在调试模式下运行(逐步)并且我在事务范围的中间停止进程时,数据库中的更改被提交. 怎么可能?

    void RootMethod()
    {
        using (TransactionScope scope = new TransactionScope())
        {

            DoSql("Update myTable Set " +
                "MyField = 'value' " +
                "Where " +
                "Id = 'test');

            //stop here
            Console.WriteLine("OK");

            DoSql("Update myTable Set " +
                "MyField = 'secondValue' " +
                "Where " +
                "Id = 'test');

            scope.Complete();
        }
    }

代码被简化以最小化复杂性以及 SQL 语句。“DoSql”函数是一个助手,代码如下:

    public static void DoSql(string cCmdSql)
    {
        string connStr = "uid=userdb;pwd=xxxxxx;server=MyServer;database=MyDatabase;Application Name=\"WebApp\";

        using (SqlConnection conn = new SqlConnection(connStr))
        {
            try
            {
                conn.Open();

                SqlCommand selectCmd = new SqlCommand(cCmdSql, conn);

                SqlDataAdapter oAda = new SqlDataAdapter();

                
                oAda.SelectCommand = selectCmd;
                oAda.SelectCommand.CommandTimeout = 300;

                DataSet oDs = new DataSet();

                oAda.Fill(oDs);

            }
            catch (SqlException ex)
            {
                Console.WriteLine("SQL: " + cCmdSql + ex.Message);
                throw;
            }
        }

        return;
    }

当我在事务中间调试进程并且我必须停止它以更正它时,我需要事务进行回滚而它没有。

但是在运行时,如果我放了一个 Transaction.Current.Rollback() 或者 sql 语句失败,事务就会回滚。

标签: c#asp.net-web-apitransactionscope

解决方案


谢谢大家。

没错,MSDTC 服务已停止,我刚刚启动并按预期工作。

我认为,那样的话,框架应该会抛出异常,但是知识就是力量,下次我会尽量不要在这上面花那么多时间。

谢谢。


推荐阅读