6

是否有不需要启用 DTC 的 transactionScope 的替代方法?

在事务中我需要进行两个操作:

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

2 回答 2

11

TransactionScope 使用 LTM - .Net 中的轻量级事务管理器。只有在同一个事务中打开多个连接或在数据库之间切换时,TransactionScope 才应该将事务提升到基于 2PC 的 TX-manager DTC。

对于 MS SQL Server 2008 及更高版本,仅当您打开与不同数据库的连接时才会涉及 DTC 。或者,如果您正在从多个线程打开相同事务中的连接,除非您使用DependentTransaction的是如果您想进行线程处理,您应该在全局事务中登记。

附带一点:我对Castle.Transactions中的多线程故事有一些支持。

旁注#2:如果您使用 TransactionScope,请确保明确声明 IsolationLevel,否则您将序列化所有事务 (IsolationLevel.Serializable)!

于 2012-06-28T11:43:32.217 回答
2

添加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

感谢保罗的帖子

于 2014-09-18T17:12:54.903 回答