MVC 3:MSDTC事务管理器无法从源中提取事务

Yas*_*ser 14 sql-server msdtc entity-framework asp.net-mvc-3

我正在使用带有实体的MVC 3,现在我已经使用了我的控制器中的以下代码行

        using (var scope = new TransactionScope())
        {
            _myRepository.DeleteFM1(id);
            _myRepository.DeleteFM2(id, name);
            scope.Complete();
        }
Run Code Online (Sandbox Code Playgroud)

在我的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();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我有一个单独的类,我已将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;
    }
Run Code Online (Sandbox Code Playgroud)

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

      _repositoryHistory.Insert(name, message, "FM2", "Delete", dateTime);
Run Code Online (Sandbox Code Playgroud)

我收到这个错误,没有这行我的代码工作得很好,我已经在我所有的其他方法中使用这一行,甚至我在那里我使用了交易范围,但我似乎仍然不明白这里的问题.请帮忙.谢谢

底层提供程序在Open上失败.

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,ITransactionShim&transactionShim)在System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(Byte []) propagationToken)---内部异常堆栈跟踪的结束---在System.Transactions.Transaction.Transaction上的System.Transactions.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction. 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,DbConnection ori ginalConnection,String exceptionCode,String attemptsOperation,Boolean&closeStoreConnectionOnFailure)

我的防火墙设置

我的防火墙设置

Jer*_*eir 15

即使配置,防火墙和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 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
Run Code Online (Sandbox Code Playgroud)


And*_*tan 7

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

检查MSDTC是否已在数据库服务器上安装并运行.

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


won*_*ter 5

使用DTCPing对DTC相关的错误进行故障排除。多年来,这一直是我使用的工具,可以对我们系统中的分布式事务写入进行故障排除。