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

时间:2012-04-27 07:17:57

标签: sql-server entity-framework asp.net-mvc-3 msdtc

我正在使用带有实体的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);

我收到此错误,没有这行我的代码工作得很好,我已经在我所有其他方法中使用了这一行,即使我在那里使用了Transaction Scope,但我似乎仍然不明白这里的问题。请帮忙。感谢

基础提供商在开放时失败。

  

System.Transactions.TransactionManagerCommunicationException:   与底层事务管理器的通信失败。 --->   System.Runtime.InteropServices.COMException:MSDTC事务   经理无法从源事务中提取事务   经理因沟通问题。可能的原因是:防火墙   存在,它没有MSDTC过程的例外,   两台机器无法通过其NetBIOS名称找到对方,或者   两个中的一个未启用对网络事务的支持   交易经理。 (来自HRESULT的异常:0x8004D02B)at   System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction(UInt32的   propgationTokenSize,Byte [] propgationToken,IntPtr managedIdentifier,   GUID&安培; transactionIdentifier,OletxTransactionIsolationLevel&   isolationLevel,ITransactionShim& transactionShim)at   System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(字节[]   propagationToken)---内部异常堆栈跟踪结束--- at   System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(字节[]   propagationToken)   System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction   tx)at   System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction   tx)at   System.Transactions.EnlistableStates.Promote(InternalTransaction tx)   在System.Transactions.Transaction.Promote()at   System.Transactions.TransactionInterop.ConvertToOletxTransaction(交易   交易)   System.Transactions.TransactionInterop.GetExportCookie(交易   交易,Byte []行踪)at   System.Data.SqlClient.SqlInternalConnection.GetTransactionCookie(交易   transaction,Byte [] whereAbouts)at   System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(交易   tx)at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction   tx)at   System.Data.SqlClient.SqlInternalConnectionTds.Activate(交易   交易)   System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(交易   交易)   System.Data.ProviderBase.DbConnectionPool.GetConnection(的DbConnection   拥有对象)   System.Data.ProviderBase.DbConnectionFactory.GetConnection(的DbConnection   拥有连接)   System.Data.ProviderBase.DbConnectionClosed.OpenConnection(的DbConnection   outerConnection,DbConnectionFactory connectionFactory)at   System.Data.SqlClient.SqlConnection.Open()at   System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(布尔   openCondition,DbConnection storeConnectionToOpen,DbConnection   originalConnection,String exceptionCode,String attemptsOperation,   布尔和放大器; closeStoreConnectionOnFailure)

My FireWall settings

我的防火墙设置

7 个答案:

答案 0 :(得分:15)

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

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

下进行了描述
  

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

     

确定运行该计算机的计算机的MSDTC CID值   Windows操作系统是唯一的,请检查条目的值   在两台计算机上的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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

我现在有几个星期的问题。我们有两个Web服务器(Win 2012)和一个DB服务器(Win 2008)。事实证明,为安全性启用“无身份验证”选项解决了我们的问题。

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我遇到了同样的问题,就我而言,在MSDTC设置中启用“无身份验证”后,该问题已解决。