没有DTC的TransactionScope替代方案

时间:2012-06-28 11:42:01

标签: c# .net-4.0 transactions transactionscope msdtc

有什么替代的transactionScope,不需要启用DTC ??

在交易中,我需要进行两项操作:

  1. 创建一个用户(使用成员资格 - sql成员资格提供程序)
  2. 执行一次插入操作。

2 个答案:

答案 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