【发布时间】:2013-11-08 18:10:58
【问题描述】:
您好,有没有办法检查使用 TransactionScope 的事务是否已提交或回滚?
【问题讨论】:
标签: c# asp.net-mvc transactionscope
您好,有没有办法检查使用 TransactionScope 的事务是否已提交或回滚?
【问题讨论】:
标签: c# asp.net-mvc transactionscope
在 TransactionScope 被释放之前,实际的 Commit 不会发生。如果 Commit 因任何原因失败,则会抛出异常。您应该捕获该异常并将失败事务的逻辑放在 Catch 块中。如果没有抛出异常,您应该确信 Commit 是成功的。如果出于任何我想不到的原因,您不信任该框架,您可以随时创建另一个 Scope 并查询结果以确保它们已被应用。
var transactionFailed = false;
try
{
using (var tx = new TransactionScope())
{
tx.Complete();
}
}
catch (TransactionAbortedException ex)
{
transactionFailed = true;
writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message);
}
catch (ApplicationException ex)
{
transactionFailed = true;
writer.WriteLine("ApplicationException Message: {0}", ex.Message);
}
catch (Exception ex)
{
transactionFailed = true;
writer.WriteLine("Exception Message: {0}", ex.Message);
}
【讨论】:
是的。只需添加一个变量并检查它。
bool txExecuted;
using (var tx = new TransactionScope())
{
//code
if (code was OK)
{
tx.Complete();
txExecuted = true;
}
}
【讨论】:
// Complete 方法提交事务。如果抛出异常,
// Complete 没有被调用,事务被回滚。
completeCallback 方法只有在 transactionScope.Complete() 方法执行成功后才会被调用
所以你可以使用函数:
public bool TryRunTransaction(Action transactionAction)
{
try
{
using (var transactionScope = new TransactionScope())
{
transactionAction();
transactionScope.Complete();
}
return true;
}
catch (TransactionAbortedException)
{
return false;
}
}
【讨论】: