【问题标题】:The transaction manager has disabled its support for remote/network transactions事务管理器已禁用对远程/网络事务的支持
【发布时间】:2012-04-25 05:22:00
【问题描述】:

我正在使用 SQL Server 和 ASP.NET。我有以下功能:

Using js = daoFactory.CreateJoinScope()
    Using tran = New Transactions.TransactionScope()
        '...
        tran.Complete()
    End Using
End Using

但是,会抛出以下异常:

事务管理器已禁用对远程/网络事务的支持。

JoinScope的描述:

Public Class JoinScope
    Implements IJoinScope
    Implements IDisposable
    '...
End Class

我在另一个具有相同环境的应用程序中以这种方式工作没有问题,但在这里我遇到了这个问题。我可以做些什么来解决这个问题?

【问题讨论】:

  • 我执行了 Magnus 建议的步骤,首先确保我已经覆盖了所有基础,可以这么说,然后设法得到一个错误,提示我在 SQL Server 中启用了 clr,并且有效为了我。 msdn.microsoft.com/en-us/library/ms131048.aspx

标签: asp.net vb.net transactionscope


【解决方案1】:

确保“分布式事务协调器”服务是 在数据库和客户端上运行。 还要确保选中“网络 DTC 访问”、“允许远程客户端”、 “允许入站/出站”和“启用 TIP”。

为 MS DTC 事务启用网络 DTC 访问

  1. 打开组件服务管理单元。

    要打开组件服务,请单击开始。在搜索框中,键入 dcomcnfg,然后按 Enter。

  2. 展开控制台树以找到您要为其启用网络 MS DTC 访问的 DTC(例如,本地 DTC)。

  3. 在“操作”菜单上,单击“属性”。

  4. 单击“安全”选项卡并进行以下更改: 在安全设置中,选中网络 DTC 访问复选框。

    在事务管理器通信中,选中允许入站和允许出站复选框。

【讨论】:

  • 谢谢你,马格努斯。它必须是应用程序的设置,因为这种类型的事务在同一台计算机上工作,这意味着这个问题与机器无关。
  • 是的,我做到了。它抛出相同的异常。
  • 我想这与您在 TransactionScope 中实际执行的操作有关。
  • 另外,我需要加入范围,因为我希望将此事务作为单个请求发送到数据库服务器。
  • 确保对事务中的所有数据库调用使用相同的打开连接。
【解决方案2】:

我有一个存储过程,它在“链接服务器”中调用另一个存储过程。当我在 ssms 中执行它时没问题,但是当我在应用程序(通过实体框架)中调用它时,我得到了这个错误。 这篇文章帮助了我,我使用了这个脚本:

EXEC sp_serveroption @server = 'LinkedServer IP or Name',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;

更多细节看这个: Linked server : The partner transaction manager has disabled its support for remote/network transactions

【讨论】:

  • 欢迎提供解决方案链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted.
  • 这解决了我的问题,所以感谢您提供这个。我不知道为什么它得到了 -1 票,因为它可以解决我的具体问题。
【解决方案3】:

在我的场景中,抛出异常是因为我试图在现有连接上的 TransactionScope 内创建一个新连接实例:

例子:

void someFunction()
{
    using (var db = new DBContext(GetConnectionString()))
    {
        using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
        {
            someOtherFunction(); // This function opens a new connection within this transaction, causing the exception.
        }
    }
}

void someOtherFunction()
{
    using (var db = new DBContext(GetConnectionString()))
    {
        db.Whatever // <- Exception.
    }
}

【讨论】:

  • 我也发生了同样的事情。谢谢你的帖子!
【解决方案4】:

我间歇性地遇到此问题,我已按照此处的说明以及其他地方的说明进行操作。一切都已正确配置。

这个页面:http://sysadminwebsite.wordpress.com/2012/05/29/9/帮我找到了问题。

基本上,我在两台服务器上都有重复的 MSDTC 的 CID。 HKEY_CLASSES_ROOT\CID

请参阅:http://msdn.microsoft.com/en-us/library/aa561924.aspx 部分确保为 MSDTC 分配了唯一的 CID 值

我正在使用虚拟服务器,我们的服务器团队喜欢为每台服务器使用相同的映像。这是一个简单的修复,我们不需要重新启动。但是 DTC 服务确实需要设置为自动启动,并且确实需要在重新安装后启动。

【讨论】:

    【解决方案5】:

    来自answer 的评论:“确保对事务内的所有数据库调用使用相同的打开连接。- Magnus”

    我们的用户存储在与我在交易中使用的数据不同的数据库中。打开数据库连接以获取用户对我来说导致了这个错误。将其他数据库连接和用户查找移到事务范围之外修复了错误。

    【讨论】:

      【解决方案6】:

      我在这里发布了以下解决方案,因为经过一番搜索,这是我登陆的地方,所以其他人也可以。我尝试使用 EF 6 调用存储过程,但由于存储过程使用了链接服务器,因此出现了类似错误。

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

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

      跳转到 SQL 客户端 确实解决了我的问题,这也向我证实了这是一个 EF 问题。

      EF 模型生成基于方法的尝试:

      db.SomeStoredProcedure();
      

      基于 ExecuteSqlCommand 的尝试:

      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 Client 一定是首选,但我觉得如果有类似问题的其他人被谷歌登陆这里,至少值得分享。

      上面的代码是 C#,但是尝试切换到 Sql Client 的概念仍然适用。至少尝试这样做是有诊断意义的。

      【讨论】:

      • 有趣。我想你可能想用 VB 代码编辑解决方案(有可用的代码翻译器),所以它会匹配问题的标签。不过,我还是投了赞成票。
      【解决方案7】:

      如果您在组件服务中找不到本地 DTC,请先尝试运行此 PowerShell 脚本:

      $DTCSettings = @(
      "NetworkDtcAccess",               # Network DTC Access
      "NetworkDtcAccessClients",        # Allow Remote Clients        ( Client and Administration)
      "NetworkDtcAccessAdmin",          # Allow Remote Administration ( Client and Administration)
      "NetworkDtcAccessTransactions",   #                (Transaction Manager Communication )
      "NetworkDtcAccessInbound",        # Allow Inbound  (Transaction Manager Communication )
      "NetworkDtcAccessOutbound" ,      # Allow Outbound (Transaction Manager Communication )
      "XaTransactions",                 # Enable XA Transactions
      "LuTransactions"                  # Enable SNA LU 6.2 Transactions
      )
      foreach($setting in $DTCSettings)
      {
      Set-ItemProperty -Path HKLM:\Software\Microsoft\MSDTC\Security -Name $setting -Value 1
      } 
      Restart-Service msdtc
      

      它出现了!

      来源:The partner transaction manager has disabled its support for remote/network transactions

      【讨论】:

        【解决方案8】:

        如果其他人有同样的问题:

        我发生了类似的错误。原来我在一个事务中包装了几个 SQL 语句,其中一个在链接服务器上执行(在 EXEC(...) AT Server 语句中执行 Merge 语句)。我通过打开到链接服务器的单独连接解决了这个问题,将该语句封装在 try...catch 中,然后中止原始连接上的事务,以防 catch 被触发。

        【讨论】:

          【解决方案9】:

          我在尝试创建存储过程时遇到了 SSMS 中的链接服务器的问题。

          在链接服务器上,我将服务器选项“启用分布式事务提升”更改为 False。

          Screenshot of Server Options

          【讨论】:

            【解决方案10】:

            我收到了同样的错误信息。对我来说,将连接字符串中的 pooling=False 更改为 ;pooling=true;Max Pool Size=200 解决了这个问题。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-12-24
              • 1970-01-01
              • 1970-01-01
              • 2021-01-01
              • 1970-01-01
              • 2011-02-03
              相关资源
              最近更新 更多