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

Posted

技术标签:

【中文标题】事务管理器已禁用对远程/网络事务的支持【英文标题】: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 【参考方案1】:

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

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

    打开组件服务管理单元。

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

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

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

    单击“安全”选项卡并进行以下更改: 在安全设置中,选中网络 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 解决了这个问题。

【讨论】:

以上是关于事务管理器已禁用对远程/网络事务的支持的主要内容,如果未能解决你的问题,请参考以下文章

该伙伴事务管理器已经禁止了它对远程/网络事务的支持

该事务管理器已经禁止了它对远程/网络事务的支持

已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。

已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。

Intellij 中的 AVD 管理器已禁用

任务管理器已被系统管理员停用的解决方法