回滚C#中的临时数据库更改
本文关键字:数据库 回滚 | 更新日期: 2023-09-27 18:24:14
我遇到了这个问题,看起来很简单,但一直在互联网上搜索,找不到解决方案。
问题/要求:在我的c#方法中,
- 我想开始交易
- 调用一些业务逻辑,最终用复杂的逻辑更新DB。(其他人写的)
- 检查数据库中的更新数据
- 无条件/强制回滚步骤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();
}
}