Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无DTC的TransactionScope备选方案_C#_.net 4.0_Transactions_Transactionscope_Msdtc - Fatal编程技术网

C# 无DTC的TransactionScope备选方案

C# 无DTC的TransactionScope备选方案,c#,.net-4.0,transactions,transactionscope,msdtc,C#,.net 4.0,Transactions,Transactionscope,Msdtc,除了transactionScope之外,是否有其他不需要启用DTC的选项 在事务中,我需要进行两个操作: 创建一个用户(使用成员资格-sql成员资格提供程序) 执行一次插入操作 TransactionScope使用.Net中的LTM轻量级事务管理器。只有在同一事务中或在数据库之间打开多个连接时,TransactionScope才应将事务升级到基于2PC的TX manager DTC 对于MS SQL Server 2008及更高版本,仅当您打开到不同数据库的连接时,才会涉及DTC。或者,如果您

除了transactionScope之外,是否有其他不需要启用DTC的选项

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

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

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

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

    作为补充:我对中的多线程故事有一些支持


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

    在您的会员资格的连接字符串中添加
    登记=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();
    }
    
    我的应用程序在AmazonEC2中发布,而数据库在AmazonRDS中。RDS不支持DTC,这就是为什么我还需要一种方法来防止升级到DTC。顺便说一句,我使用的是SQLServer2008R2。我有两个数据库-ASPNETDB,datadb


    多亏了保罗

    几乎是对的。只有打开不同的连接(SQL Server 2008+)时,事务才会升级(如果使用相同的连接字符串,则仍将使用LTM)。@Pedre-对于分布式事务,您需要事务管理器。如果是“但是”或“可能”,则为“否”。@Oded,是的,这两个版本的SQL Server也不同。@MarcGravel-不在同一个数据库/服务器上,就我所见。我认为2005年和我描述的一样,2008年支持像Oded描述的一样。Enlist=false不使用事务?根据我的经验,在连接字符串中设置
    Enlist=false
    导致
    TransactionScope
    根本不起作用;在可用的
    TransactionScope
    中未登记任何更新。我使用一个标准的SQL跟踪来验证这一点,该跟踪包括针对EntityFramework6应用程序的事务事件。