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

2

Мой код что-то вроде этого

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;
}

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

Любая идея, что пошло не так?

  • 0
    Почему вы объявляете три переменные с именем rethrow и ничего с ними не делаете? Кроме того, почему у вас есть два идентичных блока catch для разных типов исключений?
  • 0
    не сейчас, но буду использовать письмо
Показать ещё 3 комментария
Теги:
transactions

1 ответ

9
Лучший ответ

Как сообщает TransactionAbortedException,

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

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

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

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

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

  • 1
    +1 Хорошее объяснение, особенно подчеркивая, что Complete - это всего лишь голосование.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню