MVC 3:MSDTC事务管理器无法从源头上拉动交易(MVC 3 : The MSDTC trans

2019-06-24 00:52发布

我使用MVC 3的实体,现在我已经用下面的代码行从我的控制器

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

并且其发生在实体类定义我的方法我DeleteFM2方法内如下:

    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();
            }
        }
    }

我有其中I所定义的插入方法作为一个单独的类

   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,字节[] propgationToken,IntPtr的managedIdentifier,的Guid&transactionIdentifier,OletxTransactionIsolationLevel&的IsolationLevel,ITransactionShim&transactionShim)在System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(字节[] propagationToken)---内部异常堆栈跟踪的末尾在System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(字节[] propagationToken)在System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction TX)在System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction TX)在System.Transactions.EnlistableStates.Promote(InternalTransaction TX)在System.Transactions.Transaction.Promote()在System.Transactions.TransactionInterop.ConvertToOletxTransaction(事务的事务)在System.Transactions.TransactionInte rop.GetExportCookie(事务的事务,字节[]下落)在System.Data.SqlClient.SqlInternalConnection.GetTransactionCookie(事务的事务,字节[]下落)在System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(事务TX)在System.Data。 SqlClient.SqlInternalConnection.Enlist(交易TX)在System.Data.SqlClient.SqlInternalConnectionTds.Activate(交易成交)在System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(交易成交)在System.Data.ProviderBase.DbConnectionPool.GetConnection(的DbConnection owningObject )在System.Data.ProviderBase.DbConnectionFactory.GetConnection(的DbConnection owningConnection)在System.Data.ProviderBase.DbConnectionClosed.OpenConnection(的DbConnection outerConnection,DbConnectionFactory connectionFactory的)在System.Data.SqlClient.SqlConnection.Open()在System.Data.EntityClient .EntityConnection.OpenStoreConnectionIf(布尔openCondition,的DbConnection storeConnectionToOpen,ORI的DbConnection ginalConnection,字符串exceptionCode,字符串attemptedOperation,布尔逻辑closeStoreConnectionOnFailure)

我的防火墙设置

Answer 1:

该错误表示MSDTC或者未在数据库服务器上运行,包含数据库, _repositoryHistory目标; 或者,有一个网络问题阻止该事务的传播到该计算机。

检查MSDTC安装和数据库服务器上运行。

检查Windows防火墙是否在目标服务器上运行; 如果是,检查MSDTC防火墙例外。 此链接帮助与: http://technet.microsoft.com/en-us/library/cc725913(v=ws.10).aspx



Answer 2:

我也遇到过,即使配置,防火墙和NetBIOS / DNS设定正确此错误。 在我的设置这两个服务器是彼此的克隆,这样MSDTC每个服务器上有相同的CID值,这使得它们不能互操作。

这里有一些其他的事情要考虑故障排除MSDTC时http://msdn.microsoft.com/en-us/library/aa561924.aspx下确保MSDTC分配一个唯一的CID值说明我的情况

Windows操作系统的MSDTC功能需要唯一CID值,以确保计算机之间MSD​​TC功能正常工作。 Windows安装的磁盘重复的图像必须具有唯一CID值或MSDTC功能可能被削弱。 这可以通过使用虚拟硬盘部署一个操作系统到虚拟机时发生。

要确定是否正在运行的Windows操作系统MSDTC CID值电脑是唯一的,检查值作为两台计算机上的HKEY_CLASSES_ROOT \ CID注册表项下的条目。 如果这些值不为每台计算机独一无二然后按照部分中的步骤考虑重新安装分布式事务处理协调器服务,如果故障排除步骤都没有成功重新安装MSDTC上的一台计算机,那么这将为该计算机生成唯一MSDTC CID值和适应适当的MSDTC操作。

重置Windows 2012 Server上的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


Answer 3:

使用DTCPing解决DTC相关的错误。 这一直是去工具,我很多年解决分布式事务在我们的系统中写道。



Answer 4:

这里还有乱投医后,我不得不把DTC服务(MSDTC.EXE)添加到我的防火墙。
对于“分布式事务处理协调器”的默认防火墙设置使用"%SystemRoot%\system32\svchost.exe"
添加具有MSDTC.EXE新规则修复的问题。



Answer 5:

我现在已经有同样的问题了几个星期。 我们有两个Web服务器(赢2012)和一个数据库服务器(2008胜)。 原来,实现对安全的“无身份验证”选项来解决我们的问题。

CID组:MSDTC启用远程访问:MSDTC启用远程管理:禁用MSDTC无身份验证:每个服务器MSDTC网络访问上的所有不同的启用

现在,它正常工作的服务器农场。



Answer 6:

尝试回收给定的MVC Web应用程序的应用程序池。 我曾经历过这个问题,并发现这立即帮助。



Answer 7:

我有同样的问题,在我的情况下启用的MSDTC设置没有身份验证的问题就解决了。



文章来源: MVC 3 : The MSDTC transaction manager was unable to pull the transaction from the source