Исключение .net TransactionScope - PullRequest
       7

Исключение .net TransactionScope

2 голосов
/ 07 января 2010

Мой код примерно такой

try
{
    using (TransactionScope iScope = new TransactionScope())
    {
        try
        {
            isInsertSuccess = InsertProfile(account);
        }
        catch (Exception ex)
        {
            throw;
        }

        if (isInsertSuccess)
        {
            iScope.Complete();
            retValue = true;
        }
    }
}
catch (TransactionAbortedException tax)
{
    throw;
}
catch (Exception ex)
{
    throw;
}

Теперь, что происходит, даже если мое значение ИСТИНА, исключение TransactionAbortedException возникает случайно, но получение данных вставляется / обновляется в БД.

Есть идеи, что пошло не так?

1 Ответ

11 голосов
/ 07 января 2010

Как сказано в документации TransactionAbortedException,

Это исключение также генерируется при попытке совершить транзакцию и транзакция прерывается.

Вот почему вы видите исключение даже после вызова Transaction.Complete: метод Complete - это не то же самое, что Commit:

, вызывающий этоМетод [TransactionScope.Complete] не гарантирует фиксацию транзакции.Это просто способ сообщить менеджеру транзакций о вашем статусе

Транзакция не будет завершена, пока вы не выйдете из оператора using: подробности см. В документации CommittableTransaction.Commit.В этот момент любые действия, участвующие в транзакции, могут проголосовать за прерывание транзакции, и вы получите TransactionAbortedException.

Для устранения основной проблемы вам необходимо проанализировать детали исключения и трассировку стека.Как отметил Марк в комментарии, это вполне может быть вызвано тупиком или другим взаимодействием с другими процессами базы данных.

...