Нежелательное продвижение с использованием TransactionScope - PullRequest
1 голос
/ 01 мая 2011

У меня есть система, написанная на C # .net 2.0, sql 2005, где бизнес-уровень и уровень доступа к данным уже созданы и используют транзакции MSDTC.Создание и открытие соединения, закрытие и т. Д. Записываются на каждом уровне доступа к данным.

Я перехожу к новой системе, которая повторно использует старые уровни доступа к бизнесу и данным, а также предоставляет новые функциональные возможности в своем собственномбизнес-уровень и уровень доступа к данным.

Я хочу, чтобы все переходы происходили в LTM, и отмечался переход в MSDTC.

Если я пишу с использованием TransactionScope на бизнес-уровне с вызовом нескольких методов DAC внутритранзакция переводится в DTC.С новыми классами я могу справиться с этим, открыв и закрыв соединение на бизнес-уровне до начала области транзакции, но что я могу сделать для старых написанных классов.Есть ли способ в .Net 4.0 обрабатывать продвигаемую область перехода?Я использую WCF для новых сервисов и .net 4.0 для новой системы.

1 Ответ

2 голосов
/ 01 мая 2011

Недавно открытое соединение по умолчанию присоединяется к текущей транзакции. Если транзакция выполняется более чем на одном соединении (ресурсе), она автоматически переводится в 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 или переписать старые классы, чтобы использовать одно соединение. Локальная транзакция работает только на одном ресурсе (соединение).

...