есть ли альтернатива transactionScope, которой не нужно включать DTC??
В транзакции мне нужно сделать две операции:
- Создайте одного пользователя (используя членство - поставщик членства в sql)
- Выполните одну операцию вставки.
есть ли альтернатива transactionScope, которой не нужно включать DTC??
В транзакции мне нужно сделать две операции:
TransactionScope использует LTM — облегченный менеджер транзакций в .Net. Только если вы открываете более одного соединения в одной и той же транзакции или переходите между базами данных, TransactionScope должен продвигать транзакцию к диспетчеру TX на основе 2PC, DTC.
Для MS SQL Server 2008 и более поздних версий DTC будет задействован только в том случае, если вы открываете соединения с разными БД. ИЛИ, если вы открываете соединения в одних и тех же транзакциях из нескольких потоков, ЗА ИСКЛЮЧЕНИЕМ, если вы используете DependentTransaction
, что вы должны зачислить в свою глобальную транзакцию, если хотите выполнять многопоточность.
В качестве дополнения: у меня есть некоторая поддержка многопоточной истории в Castle.Transactions.
Побочный момент № 2: если вы используете TransactionScope, обязательно явно объявите IsolationLevel, иначе вы сериализуете все свои транзакции (IsolationLevel.Serializable)!
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 а>!
Enlist=false
в строке подключения привела к тому, чтоTransactionScope
вообще не работал; никаких обновлений не было зачислено в доступныйTransactionScope
. Я проверил это с помощью стандартной трассировки SQL, которая включала события транзакций для приложения Entity Framework 6. - person Jean-Paul M   schedule 21.04.2018