我有一个使用一些旧库的EF6项目(我无法修改此库)。代码就像我的项目中的代码一样:
Using scope As New TransactionScope()
//Many DAOs calls that work just nice
//The call to the legacy library that fails
End Using
代码就像库中的代码一样:
Using connection As new Sqlconnection("bla")
connection.Open() //THIS LINE FAILS INTERMITTENTLY
//more code
End Using
我已经移动了EF项目的隔离级别和事务范围,但我没有运气,它仍然会发生。是否在EF的交易中手动打开该连接?
我得到的例外是:
该操作对交易状态无效
或
与底层交易管理器的通信失败。
2014-10-11 13:49:16,736错误[DataAccess.Services]:Timbrar:该操作对事务状态无效。 InnerException:由于通信问题,MSDTC事务管理器无法从源事务管理器中提取事务。可能的原因是:存在防火墙且MSDTC进程没有例外,两台计算机无法通过其NetBIOS名称找到对方,或者两个事务管理器之一未启用对网络事务的支持。 (HRESULT异常:0x8004D02B) 2014-10-11 13:49:16,767 ERROR [DataAccess.Services]:在System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx,IPromotableSinglePhaseNotification promotableSinglePhaseNotification,Transaction atomicTransaction) 在System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification) 在System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx) at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction) 在System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,UInt32 waitForMultipleObjectsTimeout,Boolean allowCreate,Boolean onlyOneCheckConnection,DbConnectionOptions userOptions,DbConnectionInternal& connection) 在System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,TaskCompletionSource
1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource
1重试,DbConnectionOptions userOptions,DbConnectionInternal& connection) 在System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory,TaskCompletionSource1 retry, DbConnectionOptions userOptions) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource
1重试) 在System.Data.SqlClient.SqlConnection.Open() 在GuardarBitacora(String sCnn,Int64 CtePrincipalID,String NombreArchivos,String numUUID,String Proveedor,Int32 EstatusOper,String MensajeFolio,String MensajeErrorMetodo) 在CoreGenWS(String pstrXml,String usuario,String rfc,String password,Boolean sello,Boolean test) 在GenArchivoWS(String usuario,String rfc,String password,Byte [] xml,Boolean sello,Boolean test) 在Func(String usuario,String rfc,Int64 pCtePrincipalId,Boolean pftest,Byte [] xml,String pwdFac) 在Services.Func(RazonSocial razonSocial,Byte [] xmlValido) 在服务。(布尔esBorrador,Int64 usuarioId ,, encabezado,列表1 detalles, Func
1,Func3 , Func
1,Func`2)
我已经对msdtc服务进行了双重检查。在服务器和服务器中进行了相应的配置,只有在系统有一些负载时才会发生这种情况。
答案 0 :(得分:1)
我找到了解决方案(或多或少)。问题是EntityFramework无法在同一个事务中登记第二个连接,并将其升级为由MSDTC服务管理的分布式事务。
这种情况正在发生,因为即使所有连接都是在同一个数据库中进行的,也会使用不同的连接字符串建立连接。解决方案是对所有连接使用相同的连接字符串,并在此连接字符串中设置Application Name属性。之后,我能够禁用MSDTC服务,应用程序能够无异常地工作。即使我们在系统中负载很重。
这是救世主的帖子: http://joeknowsdotnet.wordpress.com/2012/07/19/entity-framework-msdtc-gotchya/
我的应用程序正在运行,生活很快乐,但我仍然不知道为什么在使用共享事务时MSDTC有时会失败....