2009-10-08 45 views

Respuesta

22

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:

  • de prueba en el cliente, literalmente:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • Use SET XACT_ABORT ON a asegurado un TXN se limpia: Question 1 y Question 2

Siempre uso SET XACT_ABORT ON.

De this SQL Team blog:

Tenga en cuenta que con la agrupación de conexiones, simplemente cerrando la conexión sin una reversión será solamente devolver la conexión a la piscina y la transacción permanecerá abierta hasta tarde reutilizado o eliminado de la piscina. Esto puede dar lugar a bloqueos comienzan a cabo innecesarios y causar otros tiempos de espera y bloque de rodadura

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

Cuando se cierra una conexión, es liberado de nuevo en el grupo y en la subdivisión correspondiente basada en contexto de transacción. Por lo tanto, puede cerrar la conexión sin generando un error, aunque todavía hay una transacción distribuida pendiente de .Esto le permite confirmar o cancelar la transacción distribuida en un más tarde.

+1

La agrupación de conexiones ocurre en el lado del cliente, por lo que si el cliente aborta internamente una conexión sin cerrarla realmente, entonces es responsable de emitir una reversión o hacer lo que sea necesario para resolver esta situación. – Fozi

+0

@Fozi: a menos que tengas SET XACT_ABORT activado. – gbn

10

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.

+9

Pero puede pasar el resto de conexiones (en espera de una confirmación/rollback) en función de su aislamiento así que el momento sigue siendo importante. –

+2

Correcto, pero el énfasis es "eventualmente", que es * algo malo * – gbn

+0

Supongo que se revierte tan pronto como se sabe que la conexión TCP (o lo que sea) está cerrada/rota. Para la agrupación de conexiones, consulte la respuesta de gbn. – Fozi

6

El servidor retrotraerá inmediatamente 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.

Cuestiones relacionadas