97

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

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

4

10 回答 10

155

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

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

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

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

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

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

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

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

于 2012-04-12T20:31:49.177 回答
13

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

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

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

于 2017-06-07T09:10:20.010 回答
11

我间歇性地遇到这个问题,我已经按照这里的说明和其他地方非常相似的说明进行操作。一切都已正确配置。

这个页面: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 服务确实需要设置为自动启动,并且确实需要在重新安装后启动。

于 2014-02-24T11:24:16.400 回答
11

在我的场景中,抛出异常是因为我试图在一个已经存在的连接上的 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.
    }
}
于 2017-03-09T09:36:34.950 回答
3

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

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

于 2016-03-08T01:15:24.573 回答
2

我在这里发布了以下解决方案,因为经过一番搜索,这是我登陆的地方,所以其他人也可以。我试图使用 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 的概念仍然适用。至少,尝试这样做将是诊断性的。

于 2018-05-10T16:59:02.057 回答
2

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

它出现了!

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

于 2020-06-19T13:59:33.127 回答
1

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

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

于 2015-11-17T00:06:13.290 回答
1

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

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

服务器选项的屏幕截图

于 2019-09-17T17:09:42.007 回答
0

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

于 2019-07-25T09:52:19.903 回答