Слід зазначити, що при використанні TransactionScope
немає необхідності у try/catch
вашій конструкції. Вам просто потрібно зателефонувати Complete
до області, щоб здійснити транзакцію, коли область дії виходить.
Сказане, TransactionScope
як правило, є кращим вибором, оскільки це дозволяє вкладати виклики до інших методів, які можуть вимагати транзакції, без необхідності передавати стан транзакції навколо.
При дзвінку BeginTransaction
на DbConnection
об'єкт, ви повинні передати цей об'єкт транзакції навколо , якщо ви хочете , щоб виконувати інші операції в одній і тій же операції, але в іншому методі.
До TransactionScope
тих пір, поки існує область дії, вона буде обробляти все, що реєструється з потоком Transaction
у потоці, роблячи ваш код чистішим та ремонтопридатнішим.
На додачу до цього, ви маєте додаткову перевагу, оскільки можете використовувати інші ресурси, які можуть брати участь у транзакціях, а не лише підключення до бази даних.
Слід зазначити, що у ситуаціях, коли вам потрібно максимально використати свої з’єднання та операції з базами даних, ви можете не захотіти використовувати TransactionScope
; навіть проти однієї бази даних ви запускаєте можливість використання Координатора розподілених транзакцій і перетворення транзакції на розподілену транзакцію (навіть для одного з'єднання з базою даних).
У цих випадках, засмучуючи ваш дизайн, ви можете розглянути можливість передачі транзакції, пов’язаної з підключенням.
Або , якщо ви знаєте, що будете використовувати один ресурс послідовно (і в тому самому потоці), можливо, ви захочете створити клас, який посилає-підраховує ваше з’єднання / транзакцію.
Ви створили б клас, який при побудові створює ваш ресурс / збільшує кількість. Він також реалізує IDisposable
(в якому ви зменшуєте / звільняєте / фіксуєте / перериваєте, коли відлік дорівнює нулю), і зберігає рахунок у змінній, яка ThreadStaticAttribute
до нього застосована.
Це дозволяє відокремити управління транзакціями від логічного коду і при цьому досить ефективно утримувати окремий ресурс (замість того, щоб перерости до розподіленої транзакції).