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


86

我正在使用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

Answers:


141

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

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

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

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

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

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

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

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


3
谢谢你,马格努斯。它必须是应用程序的设置,因为这种类型的事务处理是在同一台计算机上进行的,这意味着此问题与计算机无关。
Lajos Arpad

是的,我做到了。它引发相同的异常。
Lajos Arpad

我想这与您在TransactionScope中实际所做的事情有关。
Magnus

另外,我需要联接作用域,因为我希望将此事务作为单个请求发送到数据库服务器。
Lajos Arpad

13
确保对事务内的所有数据库调用使用相同的打开连接。
Magnus

11

我间歇性地遇到此问题,我已按照此处和其他地方的非常相似的说明进行操作。所有配置均正确。

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

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

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

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


9

我有一个存储过程在“链接服务器”中调用另一个存储过程。当我在ssms中执行它时可以,但是在应用程序中(通过实体框架)调用时,出现此错误。本文对我有帮助,我使用了以下脚本:

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

有关更多详细信息,请参见链接服务器:合作伙伴事务管理器已禁用其对远程/网络事务的支持


1
欢迎使用指向解决方案的链接,但是请确保没有该链接的情况下,您的回答是有用的:在链接周围添加上下文,以便您的其他用户可以了解它的含义和含义,然后引用您所使用页面中最相关的部分如果目标页面不可用,请重新链接。只是链接的答案可能会被删除。
佩特·弗里贝格

1
这解决了我的问题,因此感谢您提供此信息。我不知道为什么它以-1票获得通过,因为它可以解决我的特定问题。
Boyd P

6

在我的场景中,引发异常是因为我试图在一个已经存在的连接上的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.
    }
}

3

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

我们的用户与我在事务中使用的数据存储在单独的数据库中。打开数据库连接以获取用户正对我造成此错误。将其他数据库连接和用户查找移到事务作用域之外可解决此错误。


1

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

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

合作伙伴交易经理已禁用其对远程/网络交易的支持*

跳转到SQL Client确实解决了我的问题,这也为我确认这是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不一定是首选,但是我认为,如果有类似问题的任何其他人被google登陆,这至少值得分享。

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


有趣。我认为您可能想用VB代码编辑解决方案(有可用的代码翻译器),因此它将与问题的标签匹配。但是,我还是赞成它。
Lajos Arpad '18

1

如果在组件服务中找不到本地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

它出现了!

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


0

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

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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.