Существует ряд болевых точек с явными транзакциями. Первая трудность заключается в том, что каждому объекту SqlCommand
, используемому для выполнения обновлений внутри транзакции, должно быть присвоено свойство Transaction для объекта SqlTransaction
, возвращаемого BeginTransaction
. Это означает, что вы должны позаботиться о том, чтобы передать объект SqlTransaction
в любое место в вашем коде, в котором выполняется обновление, поскольку неудача при назначении его свойству Transaction
каждого объекта SqlCommand
в транзакции приводит к времени выполнения исключение. Проблема усугубляется, когда вам нужно отслеживать объект SqlTransaction
по нескольким вызовам методов, которые выполняют обновления. Управлять вещами становится еще сложнее, когда эти методы должны быть достаточно гибкими, чтобы работать независимо от того, участвует транзакция или нет.
Проблема усугубляется при работе с любой из других технологий, которые мы рассмотрим. позже это обеспечивает слои абстракции над необработанными объектами. Например, поскольку SqlDataAdapter
фактически оборачивает три отдельных объекта SqlCommand
(для вставки, обновления и удаления), вы должны копаться под адаптером данных и подключаться к его трем базовым объектам команд, чтобы вы могли установить их Transaction
свойства. (Как правило, мы не рекомендуем смешивать и сопоставлять разные API доступа к данным в вашем приложении, но если вам необходимо выполнить транзакции для обновлений в сочетании технологий, неявные транзакции облегчают это.)
Объект TransactionScope
, представленный как часть специального API управления транзакциями с. NET 2.0 в 2005 году, позволяет неявно кодировать транзакции. Это превосходный подход, который освобождает вас от всех вышеупомянутых проблем, связанных с явными транзакциями. Таким образом, руководство здесь всегда должно работать с неявными транзакциями, когда это возможно. Вы будете писать меньше кода, который будет более гибким, если вы позволите инфраструктуре обрабатывать управление транзакциями для вас. Однако все еще важно понимать явные транзакции с объектом SqlTransaction
, так как вам может потребоваться интеграция и расширение существующего кода, который уже использует явные транзакции. Поэтому мы рассмотрим оба стиля управления транзакциями, чтобы подготовить вас к любым ситуациям.
API управления транзакциями предлагает множество других преимуществ, помимо неявных транзакций. Например, TransactionScope
может автоматически преобразовывать облегченную транзакцию (одну, связанную с одной базой данных) в распределенную транзакцию, если и когда ваши обновления связаны с изменениями в нескольких базах данных.