Определение того, зафиксирован ли TransactionScope или нет - PullRequest
1 голос
/ 09 января 2012

Использование .net 2 и ADO.NET.

Есть ли способ определить, совершена ли транзакция или нет? Причина в том, что я застрял в устаревшей структуре, которую я не могу изменить, и может быть или не быть внешней транзакции. Иногда окружающая транзакция уже зафиксирована, в результате чего следующий вызов базы данных выдает исключение, и мне нужно знать, если это так или нет.

Любые указатели были бы великолепны!

Спасибо

Юхан

Ответы [ 2 ]

2 голосов
/ 11 апреля 2013

Лучший метод, который я нашел для наиболее эффективного / правильного захвата, заключается в следующем:

Внутри транзакции используя оператор и перед вызовом 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

"Вы можете зарегистрироваться для этого события вместо использования изменяемого перечисления для получения информации о результате для транзакций. Параметр, передаваемый делегату TransactionCompletedEventHandler, является экземпляром Transaction. Затем можно запросить свойство TransactionInformation определенного экземпляра, чтобы получить экземпляр объекта TransactionInformation, свойство Status которого содержит состояние транзакции со значением Committed или Aborted. "

2 голосов
/ 09 января 2012

Чек Transaction.Current.TransactionInformation.Status. Если это что-то отличное от TransactionStatus.Active, вы не должны использовать текущую транзакцию.

Само собой разумеется, что вы должны проверить Transaction.Current на null, прежде чем принимать его статус.

...