Поддерживает ли ADO Entity Framework транзакции без DTC? Несколько запросов внутри одного EntityContext и одного TransactionScope вызывают продвижение DTC - PullRequest
3 голосов
/ 08 января 2010

У меня есть веб-приложение, которое использует Entity Framework - мы используем класс TransactionScope для обеспечения окружающих транзакций.

Есть ли способ сказать EF использовать стандартную транзакцию T-SQL вместо транзакции DTC? Довольно часто мы делаем несколько запросов к разным таблицам внутри одного EntityContext и одного экземпляра TransactionScope, однако это, похоже, всегда переводит транзакцию в DTC

Я собрал короткий пример, см. Ниже. Запрос к отдельной таблице правильно запускает транзакцию T-SQL и был связан с SPID 54 Затем выполняется запрос к таблице ContactUs, и EF делает это на другом соединении (SPID 53), что влияет на преобразование транзакции в транзакцию DTC. **

using (MyEntities DB = new MyEntities())
{
    using (TransactionScope t = new TransactionScope())
    {
        DB.Individual.First().EmailAddress = "bob" + DateTime.Now.Second.ToString() + "@bob.com"; // done on connection 54
        DB.ContactUs.First(); // done on connection 53 thus promoting the transaction!!
        DB.SaveChanges();
        t.Complete();
    }
}

Ответы [ 4 ]

7 голосов
/ 04 августа 2010
  1. Установите Enlist = false в строке подключения, чтобы избежать автоматического включения в транзакцию.

  2. Вручную подключить соединение в качестве участников в области транзакции. (http://msdn.microsoft.com/en-us/library/ms172153%28v=VS.80%29.aspx)

4 голосов
/ 09 января 2010

Вы не упомянули, но похоже, что вы используете SQL Server 2005. В SQL Server 2005, если в TransactionScope открыто более одного соединения, транзакция перерастет из упрощенной транзакции в распределенную.сделка .Неважно, если это та же база данных и та же ConnectionString - она ​​все равно будет продвигаться.

Это не «проблема» с Entity Framework, а существующее поведение с System.Сделки.Проблема существует и с обычным ADO.NET.В прошлом я использовал Enterprise Library, которая под покровом поддерживает список соединений, которые участвуют в транзакциях, и если вы попытаетесь получить новое соединение во время транзакции, она вернет вам соединение, которое уже открыто и участвует в вашемтранзакция.

Если вы используете SQL Server 2008, поведение улучшается, поэтому транзакции не повышаются при открытии нескольких подключений к одной базе данных .

1 голос
/ 08 января 2010

Это не Entity Framework, который вызывает использование распределенных транзакций; скорее это TransactionScope. EF будет использовать «обычную» транзакцию, чтобы обернуть все операторы SQL, выполняемые в контексте одного вызова SaveChanges(). В приведенном вами примере у вас есть только один вызов SaveChanges. Следовательно, вам вообще не нужно было бы использовать TransactionScope, чтобы ваши изменения применялись атомарно.

Я не знаю, как заставить TransactionScope использовать нераспределенные транзакции, но я достаточно уверен, что это делает не Entity Framework.

0 голосов
/ 27 сентября 2012

Я сталкивался с проблемами эскалации DTC с использованием Entity Framework с системой членства ASP.NET, так как они используют разные строки подключения. Установка «Enlist = false» в строке подключения системы членства решила проблему для меня.

...