c# sql-server nhibernate msdtc

c# - Excepción "La operación no es válida para el estado de la transacción" utilizando TransactionScope



sql-server nhibernate (2)

Lanfear, me he encontrado con el mismo mensaje de error y encontré una solución. Su situación puede ser diferente, pero espero que el siguiente conocimiento sea útil para usted.

System.Transactions.Transaction.Current.TransactionInformation.Status devolverá el estado de la transacción actual.

En cada caso en que se lanza una excepción con el mensaje The operation is not valid for the state of the transaction , cuando paso al depurador, veo que el estado es "Anulado" antes de que se produzca la excepción.

En mi caso, el problema fue causado al anidar dos transacciones dentro de la otra y abortar por error cuando quería abortar solo una. Aparentemente, si utiliza el constructor predeterminado de TransactionScope New TransactionScope() con dos transacciones anidadas, cancelar la transacción interna anula también la transacción externa. La solución es usar el Constructor New TransactionScope(TransactionScopeOption.RequiresNew) Usando este constructor, la transacción interna será una transacción nueva y abortarla no cancelará la transacción externa.

Esto resolvió mi problema.

Tenemos un servicio web en el servidor n. ° 1 y una base de datos en el servidor n. ° 2. El servicio web usa el alcance de la transacción para producir transacciones distribuidas. Todo es correcto.

Y tenemos otra base de datos en el servidor # 3. Tuvimos algunos problemas con este servidor y volvimos a instalar el sistema operativo y el software. Configuramos MSDTC e intentamos usar el servicio web desde el servidor n. ° 1 para comunicarnos con la base de datos en este servidor. Y ahora después de la primera declaración de selección dentro del alcance de la transacción obtenemos: The operation is not valid for the state of the transaction . Esta excepción recae en cada solicitud de servicio web si usa el alcance de la transacción. Servidor # 2 y Servidor # 3 es casi similar. La diferencia puede ser solo en la configuración. .NET Framework 3.5 SP1 instalado y SQL Server SP3 en todos los servidores.

Stacktrace completo:

System.Transactions.TransactionState.EnlistPromotableSinglePhase (tx InternalTransaction, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transacción AtomicTransaction) в System.Transactions.Transaction.EnlistPromotableSinglePhase (IPromotableSinglePhaseNotification promotableSinglePhaseNotification) в System.Data.SqlClient.SqlInternalConnection.EnlistNonNull (Transaction t в System.Data.SqlClient.SqlInternalConnection .En la lista (Transacción t System System.Data.SqlClient.SqlInternalConnectionTds.Activate (Transaction transaction) System System.Data.ProviderBase.DbConnectionInternal.ActivateConnection (Transaction transaction) System System.Data.ProviderBase.DbConnectionPool.GetConnection (DbConnection owningObject) en System. Data.ProviderBase.DbConnectionFactory.GetConnection (DbConnection owningConnection) en System.Data.ProviderBase.DbConnectionClosed.OpenConnection (DbConnection outerConnection, DbConnectionFactory connectionFactory) en System.Data.SqlClient.SqlConnection.Open () NHibernate.Connection.DriverConnectionProvider.GetConnection () в NHibernate.Impl.SessionFactoryImpl.OpenConnection ()

Busqué este mensaje pero no encontré ninguna solución apropiada. Entonces, ¿qué configuración debo verificar y qué debo hacer exactamente para solucionarla?


La habilitación del Coordinador de transacciones distribuidas resolvió el problema para mí (esto se hizo en ambas máquinas: la que tiene el servicio web y la que tiene la base de datos. No estoy seguro si es necesario para el servicio web).

Seguí los pasos que se describen aquí para habilitar el DTC y agregar una excepción al Firewall de Windows: habilitar el acceso a DTC de red para Windows Server 2008