Следует отметить, что при использовании TransactionScope
нет необходимости в имеющейся у вас конструкции try/catch
. Вам просто нужно вызвать Complete
для области действия, чтобы зафиксировать транзакцию при выходе из области.
При этом, TransactionScope
обычно является лучшим выбором, потому что он позволяет вам вкладывать вызовы в другие методы, которые могут потребовать транзакцию, без необходимости передавать состояние транзакции.
При вызове BeginTransaction
для объекта DbConnection
этот объект транзакции необходимо передать, если вы хотите выполнить другие операции в той же транзакции, но в другой метод.
С TransactionScope
, пока существует область действия, он будет обрабатывать все, что регистрируется с текущим Transaction
в потоке, делая ваш код более чистым и более понятным.
Кроме того, вы можете использовать другие ресурсы, которые могут участвовать в транзакциях, а не только соединение с базой данных.
Следует отметить, что в ситуациях, когда вам нужно максимально эффективно использовать ваши соединения и операции с базой данных, вы можете не захотеть использовать TransactionScope
; даже для одной базы данных можно использовать координатора распределенных транзакций и превращать транзакцию в распределенную транзакцию (даже для одного подключения к базе данных).
В этих случаях, когда вы запутываете свой дизайн, вы можете рассмотреть возможность передачи транзакции для конкретного соединения.
или , если вы знаете, что будете использовать один ресурс последовательно (и в одном и том же потоке), возможно, вы захотите создать класс, который будет ссылаться на ваше соединение / транзакцию.
Вы бы создали класс, который при создании создает ваш ресурс / увеличивает счетчик. Он также реализует IDisposable
(в котором вы будете уменьшать / освобождать / фиксировать / прерывать, когда счетчик равен нулю), и сохранять счет в переменной, которая имеет ThreadStaticAttribute
применяется к нему.
Это позволяет отделить управление транзакциями от логического кода и при этом достаточно эффективно удерживать единичный ресурс (вместо преобразования в распределенную транзакцию).