ver transacciones solucion registro log_backup log lleno limpiar historial está esta error depurar debido datos sql sql-server transactions connection-pooling

sql - transacciones - log backup esta lleno



¿Qué sucede con una transacción no confirmada cuando la conexión está cerrada? (3)

¿Se retiran inmediatamente? ¿Se retrotraeron después de un período de tiempo? ¿Se quedan en un estado no comprometido?

¿El comportamiento es el mismo si se usa la agrupación de conexiones y las conexiones simplemente se restablecen?


El servidor revertirá de inmediato cualquier transacción no confirmada cuando se cierre una sesión.
El grupo ADO es responsable de borrar cualquier transacción sin compromiso antes de devolver una transacción al grupo. Si dispone de una conexión con transacciones pendientes, se revertirá.

Las transacciones pueden ser iniciadas por el cliente usando la API ADO (SqlConnection.BeginTransaction) o ejecutando una instrucción BEGIN TRANSACTION. El protocolo TDS entre el cliente y el servidor tiene tokens especiales que informan al cliente cuando una transacción se inició / cometió así, por lo que ADO sabe que la conexión tiene transacciones pendientes, incluso si se iniciaron en el código T-SQL.


Los cambios no confirmados no son visibles fuera de la conexión, por lo que el tiempo de la reversión es irrelevante. Entonces, sí, la transacción finalmente se retrotrae.


Puede permanecer abierto mientras se aplica la agrupación de conexiones. Ejemplo: el tiempo de espera del comando puede dejar bloqueos y TXN porque el cliente lo envía como "abortar".

2 soluciones:

  • Prueba en el cliente, literalmente:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • Use SET XACT_ABORT ON para asegurarse de que se borre una TXN: Pregunta 1 y Pregunta 2

Siempre uso SET XACT_ABORT ON .

De este blog del Equipo SQL :

Tenga en cuenta que con la agrupación de conexiones, simplemente cerrar la conexión sin una reversión solo devolverá la conexión al grupo y la transacción permanecerá abierta hasta que sea reutilizada o eliminada del grupo. Esto puede ocasionar que los bloqueos comiencen siendo innecesarios y cause otros tiempos de espera y bloqueo continuo

Desde MSDN , sección "Soporte de transacciones" (mi negrita)

Cuando se cierra una conexión, se libera de nuevo en el grupo y en la subdivisión apropiada en función de su contexto de transacción. Por lo tanto, puede cerrar la conexión sin generar un error, aunque una transacción distribuida aún esté pendiente. Esto le permite confirmar o cancelar la transacción distribuida en otro momento.