事务管理器已禁用对远程/网络事务的支持
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 安全配置中进行网络访问。