Действительно ли откат явной транзакции необходим?

Много примеров там защищают явный откат транзакций базы данных, вроде:

using (var transaction = ...)
{
    try
    {
        // do some reading and/or writing here

        transaction.Commit();
    }
    catch (SqlException ex)
    {
        // explicit rollback
        transaction.Rollback();
    }
}

Однако я склонен делать это:

using (var transaction = ...)
{
    // do some reading and/or writing here

    transaction.Commit();
}

Когда исключение происходит, я просто полагаюсь на неявный откат транзакций, которые не фиксируются.

Там какая-либо проблема полагается на это неявное поведение? У кого-либо есть убедительная причина, почему я не должен делать ее этот путь?

27
задан Kent Boogaart 17 February 2010 в 13:24
поделиться

5 ответов

Нет, в этом нет особой необходимости, однако Я могу придумать 2 причины, по которым это может быть хорошей идеей:

  • Ясность

Некоторые могут возразить, что использование transaction.Rollback () делает более ясным, при каких обстоятельствах транзакция не будет зафиксирована.

  • Снятие блокировок

При работе с транзакциями важно понимать, что определенные блокировки будут сняты только тогда, когда транзакция откатывается или фиксируется. Если вы используете оператор using , то транзакция будет отменена, когда транзакция будет удалена, однако, если по какой-то причине вам нужно выполнить некоторую обработку ошибок внутри блока с использованием , может оказаться полезным откат транзакции (снятие блокировок) перед выполнением сложной / трудоемкой обработки ошибок.

14
ответ дан 28 November 2019 в 05:51
поделиться

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

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

1
ответ дан 28 November 2019 в 05:51
поделиться

Я вижу две проблемы с вашим использованием:

  1. Вы полагаетесь на метод Dispose () транзакции для отката незафиксированной транзакции, создавая зависимость на сторонней реализации IDisposable. Конечно, в данном случае это незначительный риск, но это не очень хорошая практика.
  2. Вы упускаете возможность зарегистрировать и / или обработать исключение. Кроме того, я бы поймал Exception, а не SqlException.
4
ответ дан 28 November 2019 в 05:51
поделиться

Большинство правильно написанных соединений ADO.NET откатывают транзакции, не зафиксированные явным образом. Так что это не является строго необходимым.

Основное преимущество явного вызова Rollback() я вижу в возможности установить там точку останова и затем проверить либо соединение, либо базу данных, чтобы увидеть, что происходило. Также будущим сопровождающим кода становится понятнее, что происходит при различных путях выполнения.

1
ответ дан 28 November 2019 в 05:51
поделиться

Пока транзакция полностью автономна в блоке using (), все готово. Однако проблемы могут возникать и возникают, если кому-то передается существующий объект транзакции от вызывающей стороны. Но это другой сценарий ...

0
ответ дан 28 November 2019 в 05:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: