sql >> Base de Datos >  >> RDS >> Sqlserver

¿TSQL Try / Catch dentro de Transaction o viceversa?

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