确定是否已提交TransactionScope

时间:2012-01-09 16:02:38

标签: .net sql-server ado.net transactionscope

使用.net 2和ADO.NET。

有没有办法确定交易是否已提交?原因是我遇到了一个我无法改变的遗留框架,可能会或可能不会有环境事务。有时环境事务已经提交,导致下一次数据库调用抛出异常,我需要知道它是否存在。

任何指针都会很棒!

由于

约翰

2 个答案:

答案 0 :(得分:2)

检查Transaction.Current.TransactionInformation.Status。如果它不是TransactionStatus.Active,则不应使用当前事务。

毋庸置疑,您应该在Transaction.Current之前检查null,然后再获取其状态。

答案 1 :(得分:2)

我发现最有效/正确捕获此方法的最佳方法如下:

在transactionscope内部使用语句,并在调用scope / Complete()之前。

//Register for the transaction completed event for the current transaction
Transaction.Current.TransactionCompleted += new TransactionCompletedEventHandler(Current_TransactionCompleted);

然后按如下方式创建事件处理函数:

/// <summary>
/// Handles the TransactionCompleted event of the Current control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Transactions.TransactionEventArgs"/> instance containing the event data.</param>
static void Current_TransactionCompleted(object sender, TransactionEventArgs e)
{
    if (e.Transaction.TransactionInformation.Status == TransactionStatus.Committed)
    {
        /// Yay it's committed code goes here!
    }
}

引用MSDN

“您可以注册此事件,而不是使用volatile登记来获取事务的结果信息。传递给TransactionCompletedEventHandler委托的参数是一个Transaction实例。然后,您可以查询特定实例的TransactionInformation属性以获取实例TransactionInformation,其Status属性包含具有Committed或Aborted值的事务的状态。“