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?
ver el respuesta actualizada –
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
@Tao Quizás tengas razón, pero el autor aceptó la respuesta, por favor, no pienses por él. –