sql >> Database teknologi >  >> RDS >> Sqlserver

TSQL Prøv / fang inden for transaktion eller omvendt?

Åbn først en transaktion, når du er inde i TRY blokere og lige før selve erklæringen, og begå det med det samme. Vent ikke på, at din kontrol går til slutningen af ​​partiet for at udføre dine transaktioner.

Hvis noget går galt, mens du er i TRY blokere, og du har åbnet en transaktion, vil kontrollen hoppe til CATCH blok. Du skal blot rulle din transaktion tilbage der og udføre anden fejlhåndtering efter behov.

Jeg har tilføjet en lille check for enhver åben transaktion ved hjælp af @@TRANCOUNT funktion, før transaktionen rent faktisk rulles tilbage. Det giver ikke rigtig meget mening i dette scenarie. Det er mere nyttigt, når du laver nogle valideringstjek i din TRY blokere, før du åbner en transaktion som at tjekke param-værdier og andre ting og hæve fejl i TRY blokere, hvis nogen af ​​valideringskontrollerne mislykkes. I så fald vil kontrollen hoppe til CATCH blokere uden selv at åbne en transaktion. Der kan du tjekke for enhver åben transaktion og rollback, hvis der er nogen åbne. I dit tilfælde behøver du virkelig ikke at tjekke for nogen åben transaktion, da du ikke indtaster CATCH blokere, medmindre noget går galt i din transaktion.

Spørg ikke efter du har udført DELETE drift, uanset om den skal forpligtes eller rulles tilbage; udføre alle disse valideringer, før du åbner transaktionen. Når en transaktion er åbnet, skal du begå den med det samme, og i tilfælde af fejl skal du udføre fejlhåndtering (du gør et godt stykke arbejde ved at få detaljeret information ved at bruge næsten alle fejlfunktionerne).

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. Hvad er forskellen mellem Office 365 og Office 2016?

  2. Hvordan finder man de privilegier og roller, der er tildelt en bruger i Oracle?

  3. Overvejelser omkring kolonnerækkefølge i indekser og sorteringer

  4. Spring JDBC-understøttelse og stort datasæt