Что использовать - SqlTransaction или TransactionScope в моей архитектуре - PullRequest
2 голосов
/ 07 ноября 2011

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

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

например.

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, который может вставлять или не вставлять данные в таблицу в другой транзакции, поэтому мне нужно обрабатывать их в транзакциях.

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

Ответы [ 2 ]

7 голосов
/ 07 ноября 2011

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

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

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

Pro's для SqlTransactions

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

Con's for SqlTransaction

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

Pro для TransactionScope

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

Con для TransactionScope

  • Неопределенно, когда происходит эскалация.
4 голосов
/ 16 ноября 2012

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

...