代码之家  ›  专栏  ›  技术社区  ›  Bramha Ghosh

针对Sql Server 2000的TransactionScope错误-合作伙伴事务管理器已禁用对远程/网络事务的支持

  •  5
  • Bramha Ghosh  · 技术社区  · 17 年前

    我正试图为针对Sql 2000数据库的Linq to Sql操作设置一个简单事务。使用TransactionScope,它看起来如下所示:

    using (TransactionScope transaction = new TransactionScope())
    {
        try
            {
            Store.DBDataContext dc = new Store.DBDataContext();
            Store.Product product = GetProduct("foo");
            dc.InsertOnSubmit(product);
            dc.SubmitChanges();
            transaction.Complete();
        }
        catch (Exception ex)
        {                
            throw ex;
        }
    }
    

    但是,如果我使用传统的事务设置事务,它可以正常工作。所以这很好:

    Store.DBDataContext dc = new Store.DBDataContext();
    try
    {
        dc.Connection.Open();
        dc.Transaction = dc.Connection.BeginTransaction();
        Store.Product product = GetProduct("foo");
        dc.InsertOnSubmit(product);
        dc.SubmitChanges(); 
        dc.Transaction.Commit();
    }
    catch (Exception ex)
    {
        dc.Transaction.Rollback();
        throw ex;
    }
    finally
    {
        dc.Connection.Close();      
        dc.Transaction = null;
    }
    

    我想知道TransactionScope是否在幕后做了与我的第二个实现不同的事情。如果没有,不使用TransactionScope会损失什么?此外,任何关于导致错误的原因的指导也会很好。我已经确认MSDTC在sql server和我的客户机上都运行。

    5 回复  |  直到 17 年前
        1
  •  6
  •   Keith Sirmons    17 年前

    请看这里:

    使用System.transactions和Microsoft SQL Server 2000进行快速事务处理 http://blogs.msdn.com/florinlazar/archive/2005/09/29/475546.aspx

    在这里:
    http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=230390&SiteID=1

    首先验证“Distribute Transaction Coordinator”服务是否可用

    2.如果“Distribute Transaction Coordinator”服务未运行,请打开该服务

    如果它正在运行,并且客户端应用程序与
    1.转到“管理工具>组件服务”
    (需要时间扩展)
    3.右键单击“我的电脑”,选择“属性”

    5.单击“安全配置”
    6.确保选中“网络DTC访问”、“允许远程客户端”,

    (这是以前让我发疯的事情)

    在客户端计算机上,使用与上述相同的过程打开 访问”,“允许入站/出站”选项,重新启动服务和计算机

    在SQL server服务管理器上,单击“服务”下拉列表,选择 “Distribute Transaction Coordinator”,它也应该在上运行

        2
  •  3
  •   Bramha Ghosh    16 年前

    Keith Sirmons指出的Florin Lazar post中的DatabaseTransactionAdapter实现似乎起到了作用。以下是我调用它的代码:

    Store.DBDataContext dc = new Store.DBDataContext();
    using (TransactionScope transaction = new TransactionScope())
    {
        try
        {
            var dbAdapter = new DatabaseTransactionAdapter(dc.Connection);
            dc.Connection.Open();
            dbAdapter.Begin();
            dc.Transaction = (SqlTransaction)dbAdapter.Transaction;
            Store.Product product = GetProduct("foo");
            dc.InsertOnSubmit(product);
            dc.SubmitChanges();
            transaction.Complete();
        }
        catch (Exception ex)
        {                
            throw ex;
        }
    }
    

    唯一让我不安的是,我没有明确关闭连接,即使它没有在“using”语句中声明。

    但据Florin Lazar说,这是故意的。

    而且你也不能关闭 完成,这将在 使用语句结束。适配器 用它。

        3
  •  1
  •   Community Mohan Dere    6 年前

    首先验证“Distribute Transaction Coordinator”服务是否可用 在数据库服务器计算机和客户端计算机上运行

    1. 转到“管理工具>服务”
    2. 如果“Distribute Transaction Coordinator”服务未运行,请打开该服务

    如果它正在运行,并且客户端应用程序与

    1. 转到“管理工具>组件服务”
    2. 在左侧导航树上,转到“组件服务>计算机>我的计算机>分布式事务协调器”(由于某些节点需要时间展开,您可能需要双击并等待)
    3. 选择“安全”选项卡
    4. 服务将重新启动

    在客户端计算机上使用 与上述打开“安全配置”设置的步骤相同, 确保选中“网络DTC访问”、“允许入站/出站” 选项,如有必要,重新启动服务和计算机。

    在您的SQL server上 服务管理器,单击“服务”下拉列表,选择“分发” 事务协调器”,它也应该在您的服务器上运行

        4
  •  1
  •   Greg    8 年前

    我在这里发布下面的解决方案,因为经过一些搜索,这是我登陆的地方,所以其他人也可能。我试图使用EF 6调用存储过程,但由于该存储过程具有 正在利用中。

    无法执行该操作,因为链接服务器的OLE DB提供程序无法开始分布式事务

    合作伙伴事务管理器已禁用对远程/网络事务的支持

    跳到 确实解决了我的问题,这也证实了这是EF的事情。

    db.SomeStoredProcedure();
    

    db.Database.ExecuteSqlCommand("exec [SomeDB].[dbo].[SomeStoredProcedure]");
    

    与:

    var connectionString = db.Database.Connection.ConnectionString;
    var connection = new System.Data.SqlClient.SqlConnection(connectionString);    
    var cmd = connection.CreateCommand();
    cmd.CommandText = "exec [SomeDB].[dbo].[SomeStoredProcedure]";
    
    connection.Open();
    var result = cmd.ExecuteNonQuery();
    

    该代码可以缩短,但我认为该版本对于调试和单步执行稍微方便一些。

    我不认为Sql客户端一定是首选,但我觉得如果其他人有类似的问题被谷歌登陆这里,这至少值得分享。

        5
  •  0
  •   ToanDA ToanDA    17 年前

    -服务器配置指南 启用网络COM+访问(Windows Server 2003) 开始==>控制面板==>添加或删除程序==>添加/删除Windows组件,选择应用程序服务器,然后单击详细信息。单击启用网络COM+访问,然后单击确定。单击下一步,然后单击完成。
    -如果两台服务器之间有防火墙,则在此范围端口上打开两台输入/输出的防火墙: 单击开始==>控制面板==>管理工具==>组件服务。展开“组件服务”,展开“计算机”,右键单击“我的计算机”,然后选择“属性”。 在“我的计算机属性”窗口中,单击“默认协议”选项卡,单击面向连接的TCP/IP并选择“属性”。在新窗口中,单击添加并键入新的DTC端口范围。