Что использовать - SqlTransaction или TransactionScope в моей архитектуре

Мы используем трехуровневую архитектуру, которая содержит SqlHelper -> DAL (уровень доступа к данным) -> BAL -> UI.

Любой класс внутри DAL может вызывать другой DAL так же, как любой BAL может вызывать другой собственный BAL или DAL.

eg.

class Customer_DAL { display_CusDal(); }
class Customer_BAL { display_CusBal(); }   

class Product_DAL { display_ProDal(); }
class Product_BAL { display_ProBal(); }


display_CusDal()
{
 //call display_ProDal()
 //Do some work
}

display_CusDal функция должна выполняться как транзакция, что означает, что любая вставка, сделанная в этой функции, должна быть связана с объектом транзакции.

Поскольку display_CusDal может вызывать display_ProDal, который может вставлять или не вставлять данные в таблицу в другой транзакции, поэтому мне нужно обрабатывать их в транзакциях.

Какой подход я должен использовать.


person Shantanu Gupta    schedule 07.11.2011    source источник


Ответы (2)


SqlTransactions работает только с SQL и требует, чтобы вы явно добавили их использование. Преимущество TransactionScope в том, что к транзакции может присоединиться больше сторон. Так что не только SqlTransactions, но и транзакции других типов. Также много кода забирается при использовании области транзакции.

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

Для вашей ситуации объем транзакции кажется лучшим вариантом. Таким образом очень легко объединить несколько действий, выполняемых в Customer_DAL и Product_DAL, или несколько действий в одном DAL в одной транзакции.

Плюсы для SqlTransactions

  • Легко понять.
  • Явный
  • У вас есть полный контроль.

Минусы для SqlTransaction

  • Требуется больше кода.
  • Труднее присоединиться к большему количеству вечеринок.
  • Сложнее присоединиться к другим сделкам.
  • Связывает ваши транзакции с SQL (поэтому при переключении на другое надежное хранилище не поддерживается)

Плюсы для TransactionScope

  • Легко использовать.
  • Делает ваш код простым, вам не нужно беспокоиться о смешивании Customer_DAL и Product_DAL.
  • Отличное управление транзакциями из коробки. Включая эскалацию до MSDTC при использовании нескольких баз данных.

Минусы для TransactionScope

  • Неясно, когда происходит эскалация.
person pjvds    schedule 07.11.2011
comment
Я ценю вашу реакцию. Неясно, когда происходит эскалация. Я не понимаю, какие эскалации могут произойти. Я новичок в TransactionScope. Мне кажется несложным оценить стоимость производительности при использовании всех транзакций в одной базе данных. Но какие эскалации могут происходить в TransactionScope. - person Shantanu Gupta; 07.11.2011
comment
@ShantanuGupta TransactionScope может эскалировать транзакцию до MSTDSC, службы распределенных транзакций, которая используется, когда к транзакции присоединяются несколько сторон. Например, несколько баз данных. Таким образом, при запросе нескольких баз данных в пределах одной области транзакции диспетчер транзакций эскалирует транзакцию в MSDTSC. Большую часть информации об эскалации (и проблемах) можно прочитать здесь: stackoverflow.com/questions/1690892/ - person pjvds; 07.11.2011
comment
Важное примечание: несколько подключений к одной и той же базе данных также приводят к эскалации транзакции. - person Phillippe Santana; 08.05.2013

Я просто хочу сделать акцент на ответе @pjvds о повышении уровня транзакций до MSDTC. Мы пробовали использовать TransactionScope, и он отлично работал в нашей среде разработки. Наш код всегда вызывал повышение прав, но на нашей машине разработки случайно был установлен, включен и настроен MSDTC. Затем мы развернулись на наших производственных серверах, и все не сработало. MSDTC был отключен. И некоторые из наших производственных серверов находятся в клиентских местах, где мы не контролируем сервер. Мы не хотели требовать от наших клиентов включения и настройки MSDTC. Итак, мы вынули TransactionScope и свернули свой собственный.

person Tom Winter    schedule 16.11.2012