Figure 3 Script 1
กก
SET XACT_ABORT ON
SET LOCK_TIMEOUT 30000
SET DEADLOCK_PRIORITY LOW

DECLARE
  @err        AS INT,
  @comments   AS VARCHAR(100),
  @retry      AS INT,
  @numretries AS INT

SELECT @retry = 0, @numretries = 2

RETRY:
BEGIN TRY

  BEGIN TRAN
    UPDATE T1 SET col1 = 2
    WAITFOR DELAY '00:00:10'
    SELECT * FROM T2
  COMMIT  

  IF @@error = 0
    INSERT INTO ErrorLog(errid, comments)
      VALUES(0, 'Transaction completed successfully')

END TRY
BEGIN CATCH TRAN_ABORT

  SET @err = @@error

  IF @err = 2627
  BEGIN
    SELECT @retry = 0, @comments = 'PK violation'
  END
  ELSE IF @err = 1222
  BEGIN
    SELECT @retry = 0, @comments = 'Lock timeout expired'
  END
  ELSE IF @err = 1205
  BEGIN
    SELECT
      @retry = CASE WHEN @retry < @numretries THEN @retry + 1
                 ELSE 0 END,
      @comments = 'Deadlock;'
        + CASE WHEN @retry > 0 
                 THEN ' attempting retry #' +
                   CAST(@retry AS VARCHAR(10))
               ELSE ' aborting'
          END
  END
  ELSE
  BEGIN
    SELECT @retry = 0, @comments = 'Unhandled error'
  END

  IF @@trancount > 0 ROLLBACK

  INSERT INTO ErrorLog(errid, comments)
    VALUES(@err, @comments)

  IF @retry > 0
  BEGIN
    WAITFOR DELAY '00:00:05'
    GOTO RETRY
  END

END CATCH