2012-01-03 19 views
6

En SQL Server 2008, estoy usando un patrón de esta manera:transacción está todavía abierta después de cancelar la consulta

begin transaction 

begin try 

/* do something */ 

end try 

begin catch 

if @@TRANCOUNT > 0 
rollback 

DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int        
    SELECT @ErrMsg = ERROR_MESSAGE(),        
     @ErrSeverity = ERROR_SEVERITY()        

    RAISERROR(@ErrMsg, @ErrSeverity,1)  

end catch 

if @@TRANCOUNT > 0 
commit transaction 

cuando golpeo "Cancelar Ejecutar consulta" botón en SQL Server Management Studio se cancela la consulta y las hojas la transacción abierta.

¿Es este el comportamiento previsto? O hay un error en mi patrón. ¿No debería revertir la transacción?

Respuesta

9

En mi humilde opinión, es un comportamiento previsto. Cuando cancela la consulta que se ejecuta si hubo transacción abierta, permanece abierta hasta que la compromete explícitamente o la retrotraiga O hasta que la conexión no se cierre

No hay ningún error valioso en su patrón. Si controla el flujo de ejecución de forma manual (Cancelar ejecución de consulta), entonces debería importar las transacciones abiertas de la misma manera, de forma manual.

Actualización:

El comportamiento es controlado por SSMS opción Desconectar después de la consulta se ejecuta - lo que significa que las desconexiones de consulta después de la ejecución o cancelar y rollos de transacciones de atrás se abrió:

+0

ver el respuesta actualizada –

+2

Esta respuesta parece eludir el espíritu de la pregunta ... La pregunta podría reformularse como "¿Por qué la cancelación de una consulta no activa el bloque de" captura "de una construcción try/catch?" Si esto es un comportamiento intencionado, ¿por qué? Como diseñador de ese proceso, espero que el proceso se complete con éxito o se revierte: la semántica implícita de try/catch no permite "detener la ejecución, pero no se preocupe por el bloque catch" y deje la transacción abierta hasta que el servidor SQL decide limpiar la transacción al momento de la desconexión "... Un comportamiento sensato sería plantear un" error de cancelación ", ¿no? – Tao

+0

@Tao Quizás tengas razón, pero el autor aceptó la respuesta, por favor, no pienses por él. –

Cuestiones relacionadas