14

我正在将 MVC 3 与实体一起使用,现在我已使用控制器中的以下代码行

        using (var scope = new TransactionScope())
        {
            _myRepository.DeleteFM1(id);
            _myRepository.DeleteFM2(id, name);
            scope.Complete();
        }

在我的DeleteFM2方法中,恰好是我在 Entity 类中定义的方法如下:

    public void DeleteFM2(int id, string name)
    {
        var data= _repositoryMD.Fetch().Where(mColl => mColl.Col1 == id);

        if (data!= null)
        {
                //insert here is giving some error MSDTC error !
                // here I prepare a message using the '**data**'
                _repositoryHistory.Insert(name, message, "FM2", "Delete", dateTime);


                _repositoryMD.Attach(data);
                _repositoryMD.Delete(data);
                _repositoryMD.SaveChanges();
            }
        }
    }

我有一个单独的类,我将 Insert 方法定义为

   public bool Insert(string realName, string logMessage, string tableName, string changeType, DateTime dateTime)
    {
        var history = new History
        {
            ModifiedBy = realName,
            ChangeType = changeType,
            DateModified = dateTime,
            LogMessage = logMessage,
            TableName = tableName
        };

        _repositoryHistory.Add(history);
        _repositoryHistory.SaveChanges();

        return true;
    }

在上述方法DeleteFM2中插入这行代码后

      _repositoryHistory.Insert(name, message, "FM2", "Delete", dateTime);

我收到此错误,如果没有此行,我的代码工作得很好,我在所有其他方法中也使用了此行,即使我在那里使用过事务范围,但我似乎仍然不明白这里的问题。请帮忙。谢谢

基础提供程序在打开时失败。

System.Transactions.TransactionManagerCommunicationException:与底层事务管理器的通信失败。---> System.Runtime.InteropServices.COMException:由于通信问题,MSDTC 事务管理器无法从源事务管理器中提取事务。可能的原因是:存在防火墙并且它对 MSDTC 进程没有异常,两台机器无法通过它们的 NetBIOS 名称找到彼此,或者两个事务管理器之一未启用对网络事务的支持。(来自 HRESULT 的异常:0x8004D02B)在 System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction(UInt32 propgationTokenSize,Byte[] propgationToken,IntPtr managedIdentifier,Guid& transactionIdentifier,OletxTransactionIsolationLevel&isolationLevel,

我的防火墙设置

我的防火墙设置

4

7 回答 7

16

即使配置、防火墙和 netbios/dns 设置正确,我也遇到了这个错误。我设置中的两台服务器是彼此的克隆,因此每台服务器上的 MSDTC 具有相同的 CID 值,这使得它们无法互操作。

以下是对 MSDTC 进行故障排除时要考虑的其他一些事项 http://msdn.microsoft.com/en-us/library/aa561924.aspx 我的情况在确保为 MSDTC 分配了唯一的 CID 值下进行了描述

Windows 操作系统的 MSDTC 功能需要唯一的 CID 值,以确保计算机之间的 MSDTC 功能正常工作。Windows 安装的磁盘副本映像必须具有唯一的 CID 值,否则 MSDTC 功能可能会受损。当使用虚拟硬盘将操作系统部署到虚拟机时,可能会发生这种情况。

要确定运行 Windows 操作系统的计算机的 MSDTC CID 值是否唯一,请检查两台计算机上 HKEY_CLASSES_ROOT\CID 注册表项下的条目的值。如果这些值对于每台计算机不是唯一的,则按照考虑重新安装分布式事务协调器服务部分中的步骤如果其他故障排除步骤未成功在其中一台计算机上重新安装 MSDTC,然后将为该计算机生成唯一的 MSDTC CID 值并适应适当的 MSDTC 操作。

要在 Windows 2012 服务器上重置 CID,请使用以下 Powershell 脚本:

#View: CIDs (These must be different on all systems)
ls Microsoft.PowerShell.Core\Registry::HKEY_CLASSES_ROOT\CID | select Name


#reinstall MSDTC to regenerate CIDs. 
msdtc -uninstall
sleep 5
msdtc -install
sleep 5
Set-Service msdtc -startuptype "auto"
#then reboot for changes to take effect
于 2012-06-28T17:18:22.077 回答
7

该错误意味着 MSDTC 未在包含_repositoryHistory目标数据库的数据库服务器上运行;或者存在阻止事务传播到该机器的网络问题。

检查数据库服务器上是否安装并运行了 MSDTC。

检查目标服务器上是否正在运行 Windows 防火墙;如果是,请检查 MSDTC 的防火墙排除项。此链接对此有所帮助:http ://technet.microsoft.com/en-us/library/cc725913(v=ws.10).aspx

于 2012-04-27T07:38:58.427 回答
5

使用DTCPing解决与 DTC 相关的错误。多年来,这一直是我解决系统中分布式事务写入问题的首选工具。

于 2012-11-12T21:23:52.070 回答
2

在这里尝试了所有其他方法后,我不得不将 DTC 服务 (MSDTC.EXE) 添加到我的防火墙中。“分布式事务协调器”
的默认防火墙设置是使用. 使用MSDTC.EXE 添加新规则解决了这些问题。"%SystemRoot%\system32\svchost.exe"

于 2016-04-06T21:38:03.567 回答
1

我已经有同样的问题了几个星期了。我们有两台网络服务器(Win 2012)和一台数据库服务器(Win 2008)。事实证明,为安全启用“无身份验证”选项解决了我们的问题。

CID:每台服务器上都不同 MSDTC 网络访问:启用 MSDTC 远程访问:启用 MSDTC 远程管理:禁用 MSDTC 无身份验证:启用

现在它在服务器场中正常工作。

于 2015-05-29T23:32:14.010 回答
1

我遇到了同样的问题,在我的情况下,在 MSDTC 设置中启用“无身份验证”后问题得到了解决。

于 2019-04-16T07:21:29.850 回答
0

尝试回收给定 MVC Web 应用程序的应用程序池。我遇到过这个问题,并发现这可以立即提供帮助。

于 2013-01-17T11:01:08.237 回答