Альтернатива TransactionScope без DTC

есть ли альтернатива transactionScope, которой не нужно включать DTC??

В транзакции мне нужно сделать две операции:

  1. Создайте одного пользователя (используя членство - поставщик членства в sql)
  2. Выполните одну операцию вставки.

person Pedre    schedule 28.06.2012    source источник
comment
По моему опыту, установка Enlist=false в строке подключения привела к тому, что TransactionScope вообще не работал; никаких обновлений не было зачислено в доступный TransactionScope. Я проверил это с помощью стандартной трассировки SQL, которая включала события транзакций для приложения Entity Framework 6.   -  person Jean-Paul M    schedule 21.04.2018


Ответы (2)


TransactionScope использует LTM — облегченный менеджер транзакций в .Net. Только если вы открываете более одного соединения в одной и той же транзакции или переходите между базами данных, TransactionScope должен продвигать транзакцию к диспетчеру TX на основе 2PC, DTC.

Для MS SQL Server 2008 и более поздних версий DTC будет задействован только в том случае, если вы открываете соединения с разными БД. ИЛИ, если вы открываете соединения в одних и тех же транзакциях из нескольких потоков, ЗА ИСКЛЮЧЕНИЕМ, если вы используете DependentTransaction, что вы должны зачислить в свою глобальную транзакцию, если хотите выполнять многопоточность.

В качестве дополнения: у меня есть некоторая поддержка многопоточной истории в Castle.Transactions.

Побочный момент № 2: если вы используете TransactionScope, обязательно явно объявите IsolationLevel, иначе вы сериализуете все свои транзакции (IsolationLevel.Serializable)!

person Henrik    schedule 28.06.2012
comment
Почти верно. Только если вы откроете другие соединения (SQL Server 2008+), транзакция будет эскалирована (если вы используете ту же строку соединения, вы все равно будете использовать LTM). - person Oded; 28.06.2012
comment
@Pedre - для распределенной транзакции вам нужен менеджер транзакций. Нет, если но или может быть. - person Oded; 28.06.2012
comment
@Oded, да, это тоже зависит от версии SQL Server. - person Henrik; 28.06.2012
comment
@MarcGravell - насколько я видел, не на той же БД/сервере. - person Oded; 28.06.2012
comment
Я думаю, что 2005 год был таким, как я описал, а 2008 год поддерживал, как описывает Одед. - person Henrik; 28.06.2012
comment
@Pedre Это может зависеть от вашей реализации поставщика членства. - person Henrik; 28.06.2012
comment
Я думаю, вы можете вызвать DTC-ness, открыв несколько соединений в нескольких потоках, даже если они относятся к одной и той же БД, но если они используют одну и ту же транзакцию. - person Henrik; 28.06.2012
comment
@ Хенрик Я использую System.Web.Security.MembershipProvider. это правильно? - person Pedre; 28.06.2012
comment
iirc, если используется несколько баз данных или вложенных подключений, то транзакция будет эскалирована до распределенной. Правильный? - person abatishchev; 28.06.2012
comment
@abatishchev Я думаю, что с Server 2008 должно быть возможно открыть два соединения из одного потока для одной и той же транзакции, поскольку они объединены внутри. - person Henrik; 28.06.2012
comment
Немного поздно для вечеринки здесь, но @Henrik, вы говорите, что можете избежать DTC при открытии нескольких подключений из нескольких потоков к одной и той же базе данных в одной транзакции с помощью DependentTransaction? Откуда у вас эта информация? У меня возникли проблемы с тем, чтобы этот конкретный случай работал с использованием SQL Server 2013, поэтому я начинаю сомневаться в этом утверждении. :) - person Anders; 10.04.2014
comment
@Oded используя одну и ту же строку подключения, если я открываю разные подключения (SQL Server 2012) в течение TransactionScope эскалации транзакции (DTC). Почему ? - person PreguntonCojoneroCabrón; 08.01.2018

Добавьте Enlist=false в строку подключения вашего членства.

connectionString="Data Source=xxx;Initial Catalog=xxx;Persist Security Info=True;User ID=xxx;Password=xxx;Enlist=false"

Это мой вариант использования:

using (TransactionScope tScope = new TransactionScope())
{
    MembershipCreateStatus createStatus;
    Membership.CreateUser(model.Email, model.Password, model.Email, null, null, true, model.Id, out createStatus);

    if (createStatus == MembershipCreateStatus.Success)
    {
       Roles.AddUserToRole(model.Email, "Administrator");
       _UpdatePersonnelAccess(model);
       _UpdatePersonnelHasAccess(model);
       _SendEmail_Welcome(model);
       PersonSessionLog.ManageSession(model);
    }
    else
       ViewBag.Message = "Error";

    tScope.Complete();
}

Мое приложение опубликовано в Amazon EC2, а база данных — в Amazon RDS. DTC не поддерживается в RDS, поэтому мне также понадобился способ предотвратить эскалацию до DTC. Кстати, я использую SQL Server 2008 R2. У меня есть 2 базы данных - ASPNETDB, БД данных

Спасибо Полу post !

person danmbuen    schedule 18.09.2014
comment
Enlist=false не использует транзакцию ? - person PreguntonCojoneroCabrón; 08.01.2018