.net 在实体框架事务中使用SqlConnection

.net 在实体框架事务中使用SqlConnection,.net,sql-server,vb.net,entity-framework,transactions,.net,Sql Server,Vb.net,Entity Framework,Transactions,我有一个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.

我有一个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:16736错误[DataAccess.Services]:Timbrar:该操作对于事务的状态无效。 InnerException:由于通信问题,MSDTC事务管理器无法从源事务管理器中提取事务。可能的原因是:存在防火墙且MSDTC进程没有异常,两台计算机无法通过其NetBIOS名称找到对方,或者两个事务管理器之一未启用对网络事务的支持。(HRESULT的例外:0x8004D02B) 2014-10-11 13:49:16767错误[DataAccess.Services]:在System.Transactions.TransactionState.EnlistPromotableSinglePhase阶段(InternalTransaction tx,IPromotableSinglePhaseNotification promotableSinglePhaseNotification promotableSinglePhaseNotification,Transaction atomicTransaction) 在System.Transactions.Transaction.EnglistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification) 位于System.Data.SqlClient.SqlInternalConnection.EnclestNonNull(事务发送) 位于System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(事务) 位于System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject、UInt32 waitForMultipleObjectsTimeout、Boolean allowCreate、Boolean OnlyOnEckConnection、DbConnectionOptions userOptions、DbConnectionInternal和connection) 位于System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject、TaskCompletionSource
1重试、DbConnectionOptions用户选项、DbConnectionInternal和connection)
位于System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection-owningConnection、TaskCompletionSource
1重试、DbConnectionOptions-userOptions、DbConnectionInternal&connection) 位于System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection、DbConnectionFactory connectionFactory、TaskCompletionSource
1重试,DbConnectionOptions用户选项)
在System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource
1重试) 在System.Data.SqlClient.SqlConnection.Open()处 在GuardarBitacora(字符串sCnn、Int64 CtePrincipalID、字符串NombreArchivos、字符串numUUID、字符串Proveedor、Int32 EstatuOper、字符串mensajerefolio、字符串MensajeErrorMetodo) 在CoreGenWS(字符串pstrXml、字符串usuario、字符串rfc、字符串密码、布尔sello、布尔测试) 在GenArchivoWS(字符串usuario、字符串rfc、字符串密码、字节[]xml、布尔sello、布尔测试) at Func(字符串usuario、字符串rfc、Int64 pCtePrincipalId、布尔pftest、字节[]xml、字符串pwdFac) at Services.Func(RazonSocial RazonSocial,字节[]xmlValido) at服务。(布尔esBorrador、Int64 usuarioId、encabezado、List
1细节、Func
1、Func
3、Func
1、Func`2)


我已经对msdtc服务进行了双重检查。在服务器和服务器上都正确配置,只有在系统有一些负载时才会发生这种情况。

我找到了解决方案(或多或少)。问题是EntityFramework无法在同一事务中登记第二个连接,并将其升级为由MSDTC服务管理的分布式事务

之所以会发生这种情况,是因为即使所有连接都连接到同一个数据库,也有一些连接是使用不同的连接字符串进行的。解决方案是对所有连接使用相同的连接字符串,并在此连接字符串中设置应用程序名称属性。之后,我能够禁用MSDTC服务,并且该应用程序能够始终正常工作。即使我们的系统负载很重

以下是救世主邮报:


我的应用程序运行良好,生活也很幸福,但我仍然不知道为什么使用共享事务时MSDTC有时会失败

“只有当系统有一些负载时才会发生这种情况”连接池更愿意将首先参与当前事务的连接返回给您。这意味着通常不需要MSDTC。这意味着,只有在加载时,才会显示此选项。(我不知道这个错误的原因。)@usr是和否。这个问题完全与MSDTC有关,但我认为它总是被使用的,因为如果服务被禁用,这部分代码总是失败,无论负载是重还是低。为什么MSDTC间歇性失败?这是最大的迷雾。我不能告诉你。。。我严格地把手从MSDTC上拿开。这真是个麻烦制造者。(而且你知道你不能将它与镜像和AG一起使用,对吗?享受设计HA计划的乐趣。)+1表示“它真的是个麻烦制造者”: