Недавно открытое соединение по умолчанию присоединяется к текущей транзакции. Если транзакция выполняется более чем на одном соединении (ресурсе), она автоматически переводится в MSDTC. Вы можете заставить соединение SQL не присоединяться к текущей транзакции, указав Enlist=false
в строке соединения.
Если каждый старый класс использует свое собственное соединение, вы должны использовать MSDTC, потому что в противном случае несколько изменений данных, выполняемых вашей бизнес-логикой, не будут в одной транзакции. Пример:
using (var scope = new TransactionScope())
{
DalA.DoSomething();
DalB.DoSomething();
scope.Complete();
}
И DalA, и DalB используют свое собственное соединение. Если вы используете Enlist=false
, они не будут участвовать в транзакции, и если DalB.DoSomething завершится неудачно, он не откатит DalA.DoSomething.
Правильный подход - использовать MSDTC или переписать старые классы, чтобы использовать одно соединение. Локальная транзакция работает только на одном ресурсе (соединение).