Solo abra una transacción una vez que esté dentro del TRY
bloque y justo antes de la declaración real, y confirme de inmediato. No espere a que su control llegue al final del lote para comprometer sus transacciones.
Si algo sale mal mientras estás en TRY
bloque y ha abierto una transacción, el control saltará a CATCH
cuadra. Simplemente retroceda su transacción allí y realice otro manejo de errores según sea necesario.
He agregado un pequeño cheque para cualquier transacción abierta usando @@TRANCOUNT
antes de revertir la transacción. Realmente no tiene mucho sentido en este escenario. Es más útil cuando realiza algunas comprobaciones de validación en su TRY
bloquear antes de abrir una transacción como verificar valores de parámetros y otras cosas y generar un error en TRY
bloquear si alguna de las comprobaciones de validación falla. En ese caso, el control saltará a CATCH
bloque sin siquiera abrir una transacción. Allí puede verificar cualquier transacción abierta y revertir si hay alguna abierta. En su caso, realmente no necesita verificar ninguna transacción abierta ya que no ingresará el CATCH
bloquear a menos que algo salga mal dentro de su transacción.
No preguntes después de haber ejecutado DELETE
operación si necesita ser confirmada o revertida; haga todas estas validaciones antes de abrir la transacción. Una vez que se abre una transacción, confírmela de inmediato y, en caso de errores, realice el manejo de errores (está haciendo un buen trabajo al obtener información detallada mediante el uso de casi todas las funciones de error).
BEGIN TRY
BEGIN TRANSACTION SCHEDULEDELETE
DELETE -- delete commands full SQL cut out
DELETE -- delete commands full SQL cut out
DELETE -- delete commands full SQL cut out
COMMIT TRANSACTION SCHEDULEDELETE
PRINT 'X rows deleted. Operation Successful Tara.' --calculation cut out.
END TRY
BEGIN CATCH
IF (@@TRANCOUNT > 0)
BEGIN
ROLLBACK TRANSACTION SCHEDULEDELETE
PRINT 'Error detected, all changes reversed'
END
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage
END CATCH