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