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

4

我有一个看起来很简单的问题,但是在互联网上搜索了很久都找不到解决方案。

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

  1. 我想开始一个事务
  2. 调用一些由其他人编写的包含复杂逻辑的业务逻辑,最终更新数据库。
  3. 检查数据库中更新后的数据。
  4. 无条件/强制回滚第2步中所做的更改。(即使在业务逻辑内部提交了更改)

我尝试使用 System.Transactions.TransactionScope,但它不能按需强制回滚更改。(在调用 .Dispose 后更改不会被回滚)


在事务范围上调用 Dispose 吗? - Backs
我尝试使用,也许你应该询问如何修复在使用该类时出现的错误?显然,如果正确使用,TransactionScope能够回滚某些操作。 - usr
2个回答

1
如果一个事务被提交了,那就意味着它已经被提交了。之后没有回滚的可能性。这就是提交的目的。你最终需要更改外部代码。

0
如果“某些业务逻辑”不是您自己的数据库调用(即连接库中的某个方法),那么您无法回滚更改(如果该逻辑的开发人员没有提供此可能性)。
但是,如果该逻辑只是一些数据库调用,那么您可以在不提交的情况下回滚事务。
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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接