2

您好,有没有办法检查使用 TransactionScope 的事务是否已提交或回滚?

4

3 回答 3

4

在 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);
}
于 2013-11-08T18:28:40.293 回答
0

是的。只需添加一个变量并检查它。

bool txExecuted;

using (var tx = new TransactionScope())
{
 //code
 if (code was OK)
 {
   tx.Complete();
   txExecuted = true;
 }

}
于 2013-11-08T18:15:04.567 回答
0

关于 msdn 文档 https://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.complete(v=vs.110).aspx

// Complete 方法提交事务。如果抛出了异常,
// Complete 不会被调用并且事务被回滚。

只有在成功执行 transactionScope.Complete() 方法后才会调用 completeCallback 方法

所以你可以使用功能:

public bool TryRunTransaction(Action transactionAction)
    {
        try
        {
            using (var transactionScope = new TransactionScope())
            {
                transactionAction();
                transactionScope.Complete();
            }
            return true;
        }
        catch (TransactionAbortedException)
        {
            return false;
        }
    }
于 2017-06-22T13:18:55.387 回答