La respuesta a su pregunta depende de la configuración SET XACT_ABORT
:
Especifica si SQL Server revierte automáticamente la corriente de transacciones cuando una instrucción de Transact-SQL genera un error en tiempo de ejecución.
Cuando SET XACT_ABORT está activado, si una instrucción de Transact-SQL genera un error de tiempo de ejecución de , la transacción finaliza y se retrotrae.
Cuando SET XACT_ABORT está desactivado, en algunos casos solo se retrotrae la instrucción Transact-SQL que generó el error y la transacción continúa el procesamiento. Dependiendo de la gravedad del error, la transacción completa se puede deshacer incluso cuando SET XACT_ABORT esté desactivado. OFF es la configuración predeterminada.
Los errores de compilación, como los errores de sintaxis, no se ven afectados por SET XACT_ABORT.
Por ejemplo, intente con el siguiente código. La primera división por 0 genera un error pero continúa la ejecución. La segunda división por cero levanta una mano detiene la ejecución de error:
begin transaction
set xact_abort off
select 1/0 -- causes divide by zero error, but continues
select @@trancount -- returns 1
set xact_abort on
select 1/0 -- causes divide by zero error and terminates execution
select @@trancount -- we never get here
rollback
Si XACT_ABORT está en ON, a continuación, los errores se abortará la transacción, y que no necesitan un try/catch.
Si XACT_ABORT está en OFF, tendrá que comprobar el estado de cada declaración para ver si se ha producido un error:
begin transaction
delete from...
if @@error <> 0
begin
if @@trancount > 0
rollback
return
end
insert into...
if @@error <> 0
begin
if @@trancount > 0
rollback
return
end
commit
Sin embargo, si alguna vez encontrar un caso en el que hay que probar/CATCH, se puede necesitar hacer algo especial cuando ocurre el error. Si es así, no te olvides de TRY/CATCH el manejo de excepciones:
begin transaction
set xact_abort on
begin try
select 1/0 -- causes divide by zero error and terminates execution
select @@trancount -- we never get here
commit
end try
begin catch
select xact_state() -- this will be -1 indicating you MUST rollback before doing any other operations
select @@trancount -- this will probably be one, because we haven't ended the transaction yet
if xact_state() <> 0
begin try
select 'rollback'
rollback
-- do something to handle or record the error before leaving the current scope
select 'exception processing here'
--insert into...
end try
begin catch
-- ignore rollback errors
end catch
end catch