sql >> Database >  >> RDS >> Sqlserver

TSQL Try / Catch binnen Transactie of vice versa?

Open pas een transactie als u zich binnen de TRY . bevindt blok en net voor het eigenlijke statement, en commit het meteen. Wacht niet tot uw controle naar het einde van de batch gaat om uw transacties vast te leggen.

Als er iets misgaat terwijl je in de TRY blok en je hebt een transactie geopend, springt de besturing naar de CATCH blok. U kunt uw transactie daar gewoon terugdraaien en desgewenst andere foutafhandelingen uitvoeren.

Ik heb een kleine cheque toegevoegd voor elke openstaande transactie met behulp van @@TRANCOUNT functie voordat u de transactie daadwerkelijk terugdraait. In dit scenario heeft het weinig zin. Het is handiger wanneer u enkele validatiecontroles uitvoert in uw TRY blokkeren voordat u een transactie opent, zoals het controleren van parameterwaarden en andere dingen en het verhogen van een fout in de TRY blokkeren als een van de validatiecontroles mislukt. In dat geval springt de besturing naar de CATCH blokkeren zonder zelfs maar een transactie te openen. Daar kunt u controleren op openstaande transacties en terugdraaien als er openstaande transacties zijn. In uw geval hoeft u echt niet te controleren op openstaande transacties, aangezien u de CATCH niet invoert blokkeren, tenzij er iets misgaat in uw transactie.

Niet vragen nadat u de DELETE . heeft uitgevoerd operatie of het moet worden gepleegd of teruggedraaid; doe al deze validatie voordat u de transactie opent. Zodra een transactie is geopend, voert u deze meteen uit en in geval van fouten, voert u de foutafhandeling uit (u doet goed werk door gedetailleerde informatie te krijgen door bijna alle foutfuncties te gebruiken).

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


  1. Hoe Galera-cluster te beveiligen - 8 tips

  2. Oracle verwijderquery duurt te lang

  3. Een 64-bits applicatie verbinden met Acomba

  4. Hoe de standaard MySQL/MariaDB-poort in Linux te wijzigen