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

时间:2008-11-26 15:00:33

标签: linq-to-sql transactions transactionscope msdtc

我正在尝试针对我的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;
    }
}

但是,我不断收到以下错误:

合作伙伴事务管理器已禁用其对远程/网络事务的支持。 (HRESULT异常:0x8004D025)

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

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和我的客户机上运行。

4 个答案:

答案 0 :(得分:6)

看看这里:

使用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

  

首先验证“分发事务协调器”服务是否为   在数据库服务器计算机和客户端计算机上运行
  1.转到“管理工具>服务”
  2.如果未运行,请启用“分发事务处理协调器”服务

     

如果它正在运行且客户端应用程序与其不在同一台计算机上   数据库服务器,在运行数据库服务器的计算机上   1.转到“管理工具>组件服务”
  2.在左侧导航树中,转到“组件服务>计算机>我的电脑”(您可能需要双击并等待某些节点   需要时间扩大)
  3.右键单击“我的电脑”,选择“属性”
  4.选择“MSDTC”选项卡
  5.单击“安全配置”
  6.确保选中“网络DTC访问”,“允许远程客户端”,   “允许入站/出站”,“启用提示”(某些选项可能不是   必要的,试着让你的配置)   7.服务将重新开始   8.但是如果它仍然不工作,你可能需要重新启动你的服务器   (这是让我疯狂的事情)

     

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

     

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

答案 1 :(得分:2)

在Kein Sirmons指出我的Florin Lazar帖子中的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的说法,这是故意的。

  

你也不能关闭   连接,因为连接   应该保持开放直到交易   完成后,发生在   “使用”声明结束。适配器   将取得连接的所有权   一生,并在完成后关闭它   用它。

答案 2 :(得分:1)

在Windows 2008或更高版本上启用此功能的步骤如下:

  

首先验证“分发事务协调器”服务是否为   在数据库服务器计算机和客户端计算机上运行

     
      
  1. 转到“管理工具>服务”
  2.   
  3. 如果“分发交易协调员”服务未运行,请将其打开
  4.         

    如果它正在运行且客户端应用程序与其不在同一台计算机上   数据库服务器,在运行数据库服务器的计算机上

         
        
    1. 转到“管理工具>组件服务”
    2.   
    3. 在左侧导航树中,转到“组件服务>计算机>我的电脑>分布式事务处理协调器”(您可能需要双击并等待,因为某些节点需要时间来扩展)
    4.   
    5. 右键点击“本地DTC”,选择“属性”
    6.   
    7. 选择“安全”标签
    8.   
    9. 确保选中“网络DTC访问”,“允许远程客户端”,“允许入站/出站”
    10.   
    11. 服务将重启
    12.   
    13. 但是如果它仍然无法工作,你可能需要重新启动你的服务器(这是让我疯狂的事情)
    14.         

      在您的客户端计算机上使用   以上程序打开“安全配置”设置,   确保选中“网络DTC访问”,“允许入站/出站”   选项,如有必要,重启服务和计算机。

           

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

答案 3 :(得分:0)

更多通知: - 服务器配置指南 启用网络COM +访问(Windows Server 2003) 开始==>控制面板==>添加或删除程序==>添加/删除Windows组件,选择Application Server,然后单击详细信息。单击“启用网络COM +访问”,然后单击“确定”。单击“下一步”,然后单击“完成” - 如果2个服务器之间有防火墙,则在此范围端口上打开/关闭两个服务器: 点击开始==>控制面板==>管理工具==>组件服务。展开组件服务,展开计算机,右键单击我的电脑,然后选择属性。 在“我的电脑属性”窗口中,单击“默认协议”选项卡,单击面向连接的TCP / IP并选择“属性”。在新窗口中,单击“添加”并键入新的DTC端口范围。 单击“确定”以应用这些更改。 必须重新启动服务器才能使新更改生效