Saltar al contenido

“Esta SqlTransaction se ha completado; ya no se puede utilizar”…. ¿error de configuración?

Te damos la contestación a esta contrariedad, o por lo menos eso esperamos. Si continuas con inquietudes dínoslo, que sin dudarlo te responderemos

Solución:

Creo que este mensaje de error se debe a una “transacción zombie”.

Busque posibles áreas en las que la transacción se comprometa dos veces (o se retrotraiga dos veces, o se retrotraiga y se comprometa, etc.). ¿El código .Net confirma la transacción después de que el SP ya la haya confirmado? ¿El código .Net lo revierte al encontrar un error, luego intenta revertirlo nuevamente en una cláusula de captura (o finalmente)?

Es posible que nunca se haya alcanzado una condición de error en el servidor anterior y, por lo tanto, nunca se haya alcanzado el código defectuoso de “reversión doble”. Tal vez ahora tienes una situación en la que hay es algún error de configuración en el nuevo servidor, y ahora el código defectuoso se ve afectado por el manejo de excepciones.

¿Puedes depurar el código de error? ¿Tienes un rastro de pila?

Tuve esto recientemente después de refactorizar en un nuevo administrador de conexión. Una nueva rutina aceptó una transacción para que pudiera ejecutarse como parte de un lote, el problema era con un bloque de uso:

public IEnumerable Query(IDbTransaction transaction, string command, dynamic param = null)

  using (transaction.Connection)
  
    using (transaction)
    
      return transaction.Connection.Query(command, new DynamicParameters(param), transaction, commandType: CommandType.StoredProcedure);
    
  

Parece que el uso externo estaba cerrando la conexión subyacente, por lo que cualquier intento de confirmar o revertir la transacción arrojó el mensaje. "This SqlTransaction has completed; it is no longer usable."

Eliminé los usos, agregué una prueba de cobertura y el problema desapareció.

public IEnumerable Query(IDbTransaction transaction, string command, dynamic param = null)

  return transaction.Connection.Query(command, new DynamicParameters(param), transaction, commandType: CommandType.StoredProcedure);

Compruebe si hay algo que pueda estar cerrando la conexión mientras está dentro del contexto de una transacción.

Tengo el mismo problema. Este error ocurre debido a la agrupación de conexiones. Cuando existen dos o más usuarios que acceden al sistema, la agrupación de conexiones reutiliza una conexión y la transacción también. Si el primer usuario ejecuta commit o rollback, la transacción ya no se puede utilizar.

Si te gustó nuestro trabajo, tienes la habilidad dejar un ensayo acerca de qué le añadirías a este escrito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *