lunedì 21 gennaio 2013

TRY CATCH in Sql Server


Con questa procedura è possibile intercettare un particolare errore (in questo caso un Deadlock), e rieseguire la procedura richiesta, per un determinato numero di volte (per evitare un loop)
DECLARE @RetryCounter INT
SET @RetryCounter = 1
RETRY: -- Label RETRY
BEGIN TRANSACTION
BEGIN TRY

 UPDATE Customer SET LastName = 'John' WHERE CustomerId=111
 

 COMMIT TRANSACTION
END TRY
BEGIN CATCH
 PRINT 'Rollback Transaction'
 ROLLBACK TRANSACTION
 DECLARE @DoRetry bit; -- Whether to Retry transaction or not
 DECLARE @ErrorMessage varchar(500)
 SET @doRetry = 0;
 SET @ErrorMessage = ERROR_MESSAGE()
 IF ERROR_NUMBER() = 1205 -- Deadlock Error Number
 BEGIN
  SET @doRetry = 1; -- Set @doRetry to 1 only for Deadlock
 END
 IF @DoRetry = 1
 BEGIN
  SET @RetryCounter = @RetryCounter + 1 -- Increment Retry Counter By one
  IF (@RetryCounter > 3) -- Check whether Retry Counter reached to 3
  BEGIN
   RAISERROR(@ErrorMessage, 18, 1) -- Raise Error Message if 
    -- still deadlock occurred after three retries
  END
  ELSE
  BEGIN
   WAITFOR DELAY '00:00:00.05' -- Wait for 5 ms
   GOTO RETRY -- Go to Label RETRY
  END
 END
 ELSE
 BEGIN
  RAISERROR(@ErrorMessage, 18, 1)
 END
END CATCH

Nessun commento: