C# 回滚C中的临时数据库更改#

C# 回滚C中的临时数据库更改#,c#,sql-server,transactions,sql-server-2012,C#,Sql Server,Transactions,Sql Server 2012,我有一个看似简单的问题,但一直在网上搜索,却找不到解决办法 问题/要求: 在我的c#方法中 我想开始一笔交易 调用一些业务逻辑,最终用复杂的逻辑更新数据库。(由其他人编写) 检查数据库中的更新数据 无条件/强制回滚步骤2中完成的更改(即使更改在业务逻辑中提交) 我尝试使用System.Transactions.TransactionScope,但它无法按需强制回滚更改。(调用.Dispose时不会回滚更改)如果事务已提交,则已提交。之后就没有退路了。这就是提交的重点。您最终将不得不更改外部代码。

我有一个看似简单的问题,但一直在网上搜索,却找不到解决办法

问题/要求: 在我的c#方法中

  • 我想开始一笔交易
  • 调用一些业务逻辑,最终用复杂的逻辑更新数据库。(由其他人编写)
  • 检查数据库中的更新数据
  • 无条件/强制回滚步骤2中完成的更改(即使更改在业务逻辑中提交)

  • 我尝试使用
    System.Transactions.TransactionScope
    ,但它无法按需强制回滚更改。(调用
    .Dispose
    时不会回滚更改)

    如果事务已提交,则已提交。之后就没有退路了。这就是提交的重点。您最终将不得不更改外部代码。

    如果“某些业务逻辑”不是您自己的DB调用(即连接库中的某些方法),则您无法回滚更改(如果该逻辑的开发人员不提供这种可能性)

    但是,如果该逻辑只是一些DB调用,那么您可以在不提交的情况下回滚事务

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
    
        // Start a local transaction.
        SqlTransaction sqlTran = connection.BeginTransaction();
    
        // Enlist a command in the current transaction.
        SqlCommand command = connection.CreateCommand();
        command.Transaction = sqlTran;
    
        try
        {
            // Here is your "business logic"
            command.CommandText = "INSERT INTO tbBusinessLogic VALUES(1)";
            command.ExecuteNonQuery();
    
            // Check result
            command.CommandText = "Select 1 from tbBusinessLogic";
            var result = (Int32)command.ExecuteScalar();
            CheckResult(result);
    
            // Rollback the transaction.
            sqlTran.Rollback();
        }
        catch (Exception ex)
        {
            Logger.LogError(ex);
            sqlTran.Rollback();
        }
    }
    

    调用事务作用域上的
    Dispose
    我尝试使用
    也许您应该询问如何修复使用该类时所犯的错误?显然,如果使用正确,TransactionScope能够回滚某些内容。