使用.net 2和ADO.NET。
有没有办法确定交易是否已提交?原因是我遇到了一个我无法改变的遗留框架,可能会或可能不会有环境事务。有时环境事务已经提交,导致下一次数据库调用抛出异常,我需要知道它是否存在。
任何指针都会很棒!
由于
约翰
答案 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值的事务的状态。“