有什么替代的transactionScope,不需要启用DTC ??
在交易中,我需要进行两项操作:
答案 0 :(得分:11)
TransactionScope在.Net中使用LTM - 轻量级事务管理器。只有当您在同一个事务中打开多个连接或在数据库之间切换时,TransactionScope才会将事务提升到基于2PC的TX管理器DTC。
对于MS SQL Server 2008及更高版本,仅当您打开与不同数据库的连接时,才会涉及DTC。或者,如果要在多个线程的相同事务中打开连接,则除非使用DependentTransaction
,否则如果要进行线程处理,则应在全局事务中登记。
作为一个侧面点:我对Castle.Transactions中的多线程故事有一些支持。
侧点#2:如果您使用TransactionScope,请确保明确声明IsolationLevel,否则您将序列化所有事务(IsolationLevel.Serializable)!
答案 1 :(得分:3)
在您的会员资格的连接字符串中添加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中。 RDS不支持DTC,这也是我需要一种方法来防止升级到DTC的原因。顺便说一句,我使用的是SQL Server 2008 R2。我有2个数据库 - ASPNETDB,数据DB
感谢保罗post!