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

时间:2012-04-12 19:53:20

标签: asp.net vb.net transactionscope

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

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

9 个答案:

答案 0 :(得分:121)

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

为MS DTC交易启用网络DTC访问

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

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

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

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

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

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

答案 1 :(得分:10)

我间歇性地得到这个问题,我按照这里的说明和其他地方非常相似。全部配置正确。

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

答案 2 :(得分:6)

我有一个存储过程调用另一个存储过程在“链接服务器”中。当我在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

答案 3 :(得分:4)

在我的场景中,抛出了异常,因为我试图在已经存在的连接上的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 :(得分:3)

来自answer的评论:&#34;确保对事务内的所有数据库调用使用相同的开放连接。 - 马格努斯&#34;

我们的用户存储在与我在交易中使用的数据不同的数据库中。打开数据库连接以获取用户对我造成了此错误。在事务范围之外移动其他数据库连接和用户查找修复了错误。

答案 5 :(得分:1)

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

df = data.frame(
  A = c(1, 4, 5, 13, 2),
  B = c("Group 1", "Group 3", "Group 2", "Group 1", "Group 2"),
  C = c("Group 3", "Group 2", "Group 1", "Group 2", "Group 3")
)

df %>%
  group_by(B) %>%
  summarise(val = mean(A))

df %>%
  group_by(C) %>%
  summarise(val = mean(A))

它出现了!

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

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

Screenshot of Server Options