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