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

本文关键字:数据库 回滚 | 更新日期: 2023-09-27 18:24:14

我遇到了这个问题,看起来很简单,但一直在互联网上搜索,找不到解决方案。

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

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

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

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

如果事务被提交,它就被提交。之后就没有回头路了。这就是承诺的意义所在。您最终将不得不更改外部代码。

如果"某个业务逻辑"不是您自己的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();
    }
}