sql >> Databasteknik >  >> RDS >> Sqlserver

TSQL Prova / fånga inom transaktion eller vice versa?

Öppna bara en transaktion när du är inne i TRY blockera och strax före själva uttalandet, och begå det direkt. Vänta inte på att din kontroll går till slutet av partiet för att utföra dina transaktioner.

Om något går fel medan du är i TRY blockera och du har öppnat en transaktion, kommer kontrollen att hoppa till CATCH blockera. Återställ helt enkelt din transaktion där och gör annan felhantering vid behov.

Jag har lagt till en liten check för alla öppna transaktioner med @@TRANCOUNT funktion innan transaktionen faktiskt återställs. Det är inte riktigt vettigt i det här scenariot. Det är mer användbart när du gör några valideringskontroller i din TRY blockera innan du öppnar en transaktion som att kontrollera param-värden och andra saker och höja felet i TRY blockera om någon av valideringskontrollerna misslyckas. I så fall kommer kontrollen att hoppa till CATCH blockera utan att ens öppna en transaktion. Där kan du kontrollera eventuella öppna transaktioner och återställa om det finns några öppna. I ditt fall behöver du verkligen inte leta efter någon öppen transaktion eftersom du inte kommer att ange CATCH blockera om inte något går fel i din transaktion.

Fråga inte efter att du har utfört DELETE drift oavsett om den behöver begås eller rullas tillbaka; gör alla dessa validering innan du öppnar transaktionen. När en transaktion har öppnats, utför den omedelbart och vid eventuella fel, gör felhantering (du gör ett bra jobb genom att få detaljerad information genom att använda nästan alla felfunktioner).

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. Använda automation för att påskynda releasetesterna på PostgreSQL

  2. Hur man kontrollerar om mysql-databas finns

  3. Fixar ett skadat TOAST-bord

  4. python lägger till E till strängen