2012-04-27 88 views
10

我使用MVC 3与实体拉动成交,现在我已经用下面的一行代码从我的控制器MVC 3:MSDTC事务管理器无法从源头

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

,我有,我已经定义插入方法

一独立的类
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.TransactionStatePS PEOperation.PSPEPromote(InternalTransaction TX)在 System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction TX)维持在 系统 System.Transactions.EnlistableStates.Promote(InternalTransaction TX) 在System.Transactions.Transaction.Promote()。 Transactions.TransactionInterop.ConvertToOletxTransaction(事务 交易)在 System.Transactions.TransactionInterop.GetExportCookie(事务 交易,字节[]下落)在 System.Data.SqlClient.SqlInternalConnection.GetTransactionCookie(事务 交易,字节[]下落)在 System.Data.SqlClient.SqlInternalConnection.EnlistN onNull(事务 tx)在System.Data.SqlClient.SqlInternalConnection。在在 System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(交易 交易) System.Data.SqlClient.SqlInternalConnectionTds.Activate(交易 交易)争取(交易 TX)在 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 originalConnection,字符串exceptionCode,字符串attemptedOperation, 布尔& closeStoreConnectionOnFailure)

My FireWall settings

我的防火墙设置

+0

是同一台服务器上的两个存储库的数据库? – 2012-04-27 07:31:34

+0

我已经更新了代码 – Yasser 2012-04-27 07:33:51

回答

4

的错误表示MSDTC是或者不在包含数据库的数据库服务器上运行,该数据库的目标是_repositoryHistory;或者存在阻止交易传播到该机器的网络问题。

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

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

+0

我遵循了您的建议(请参阅更新后的截图),我在许多不同的地方使用这个_repositoryHistory,实际上这是在有更新/插入/删除时进行日志记录。我已经在超过50个地方使用过它,它在那里工作的很好,我甚至在与DeleteFM2()方法所在的同一个类中使用它。它不适用于此。 – Yasser 2012-04-27 07:48:43

+0

,它总是与'_repositoryMD'一起使用? MSDTC通信必须能够在这两个数据库所在的服务器之间工作 – 2012-04-27 08:27:02

+0

我只有一个数据库... – Yasser 2012-04-27 08:41:50

13

即使配置,防火墙和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 
+0

是否这样,同样的问题仍然存在 – 2012-09-26 20:01:37

+0

它解决了我的问题。 DTCPing明确表示“重复的CID” – 2016-06-09 11:11:35

3

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

+1

无法推荐此实用程序! – 2013-11-07 19:00:00

+0

完全同意。 DTCPing让我看到CID被复制了 – 2016-06-09 11:12:21

0

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

0

我已经有相同的问题,现在几个星期。我们有两台Web服务器(Win 2012)和一台DB服务器(Win 2008)。原来,启用“不认证”选项的安全解决了我们的问题。

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

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

1

在尝试了其他所有功能后,我必须将DTC服务(MSDTC.EXE)添加到我的防火墙中。
“分布式事务处理协调器”的默认防火墙设置使用“%SystemRoot%\ system32 \ svchost.exe”。
使用MSDTC.EXE添加新规则修复了这些问题。

+0

如果它是对现有答案的延续,那么最好编辑帖子并把这些信息,而不是作为一个不同的答案张贴。 – Raju 2016-04-06 22:01:24