【问题标题】:TransactionScope alternative without DTC没有 DTC 的 TransactionScope 替代方案
【发布时间】:2012-06-28 11:42:00
【问题描述】:

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

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

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

【问题讨论】:

  • 根据我的经验,在连接字符串中设置Enlist=false 会导致TransactionScope 根本不起作用;可用的TransactionScope 中没有更新。我使用标准 SQL 跟踪验证了这一点,该跟踪包括针对 Entity Framework 6 应用程序的事务事件。

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


【解决方案1】:

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

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

顺便说一句:我对Castle.Transactions 中的多线程故事有一些支持。

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

【讨论】:

  • 几乎正确。只有当您打开不同的连接(SQL Server 2008+)时,事务才会升级(如果您使用相同的连接字符串,您仍将使用 LTM)。
  • @Pedre - 对于分布式事务,您需要一个事务管理器。没有如果但是或可能。
  • @Oded,是的,SQL Server 的版本也不同。
  • @MarcGravell - 据我所见,不在同一个数据库/服务器上。
  • 我认为 2005 年就像我描述的那样,而 2008 年支持就像 Oded 描述的那样。
【解决方案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

感谢保罗post

【讨论】:

  • Enlist=false 不使用 Transaction ?
猜你喜欢
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 2013-10-14
  • 1970-01-01
  • 2016-06-11
相关资源
最近更新 更多