sql >> Base de Datos >  >> RDS >> Sqlserver

¿Qué sucede con una transacción no confirmada cuando se cierra la conexión?

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 envía como "abortar".

2 soluciones:

  • Prueba en el cliente, literalmente:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • Utilice SET XACT_ABORT ON para garantizar que se limpie una TXN:Pregunta 1 y Pregunta 2

Siempre uso SET XACT_ABORT ON .

De este blog del equipo de 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 se vuelva a utilizar o se elimine del grupo.

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

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