0

У меня есть ситуация, когда у меня есть 2 базы данных.Транзакция базы данных с двумя базами данных - этот метод правильный?

Менеджер имеет таблицу компаний, исходя из этого значения. Мне нужно создать новую БД.

Так что я использую TransactionScope. Я хочу знать, правильно ли это?

Будет ли это откат обоих изменений? В обоих случаях, если ошибка возникает?

using (TransactionScope ts = new TransactionScope()) 
{ 
    try 
    { 
     using(var ManagerContext = new ManagerEntities(
      ConnectionStringManager.GetManagerConnectionString())) 
     { 
      //Operations on Manager DB       
      // Create new Company and get NEWCOMPANYID 
      // -- Used to create new DB 
     } 

     using(var companyContext = new CompanyEntities(
      ConnectionStringManager.GetCompanyConnectionString(
       NEWCOMPANYID.ToString()))) 
     { 
      //Create New Company DB 
     } 

     ts.Complete(); 
    } 
    catch (Exception ex) 
    { 
     ts.Dispose(); 
    } 
} 
+0

Трюк избыточен, так как оператор 'using' уже обеспечивает удаление для' TransactionScope'. – Steven

+0

Я не понимаю, что вы имеете в виду. У меня есть ts.Dispose(), если какая-либо ошибка возникает в блоке try {} –

+0

Это будет работать, если активирован координатор распределенной транзакции (например, см. Http://www.luisrocha.net/2011/08/managing -transactions-with-entity.html) – Matten

ответ

2

До тех пор, пока оба эти контексты баз данных TransactionScope известно, и не в явном виде не имеют окружающую среду сделки Заручившись отключена (в строке подключения, например), то да: что должно работать нормально. Если мы предположим, что две строки соединения разные, это будет определенно требует распределенной транзакции (DTC), хотя - зависит ли это от вас. Если строки соединения идентичны, вы можете уйти с LTM вместо (меньше служебных/конфигурационных).

Обратите внимание, что согласно комментариям - вам не нужен try/finally.

+0

У вас есть ссылка на пошаговое руководство по активации DTC для Windows Server 2008 R2? –

+0

@Dawood нет, но Google, вероятно, делает –

+0

Последний вопрос. Использует TransactionScopr Rollbak, T-SQL Scripts, которые выполняются в области. например У меня есть сценарий T-SQL для генерации таблиц и хранимых процедур. Если этот скрипт завершится с ошибкой, он все это сделает? –

2

Это нормально, хотя это вызовет DTC, как объяснил Марк. Вы можете избежать DTC, используя один SqlConnection (или EntityConnection), который разделяет оба контекста. Вы можете переключить текущую базу данных соединения с помощью ChangeDatabase. Это позволяет избежать необходимости в распределенных транзакциях.

Вы также должны открыть соединение явно, потому что EF по умолчанию открывается и закрывает его для каждого действия. Это вызывает множественные призывы DTC (более 2). Это дефект дизайна в EF.

+0

Похоже, что LTM (а не DTC) все равно может быть использован в этом сценарии. Тем не менее, я не планирую пытаться проверить –

+0

. Я обнаружил, что он не является детерминированным, требуется ли вам DTC или нет.Если второе соединение является одним и тем же базовым соединением пула, как первое, вам не нужен код DTC. Если это происходит, это вызывает DTC. Вы обычно находите эту ошибку только при загрузке в производство. Ужасный выбор дизайна. – usr