Это хорошая идея - обрабатывать повторную попытку взаимоблокировки из блока перехвата хранимой процедуры

Насколько я понимаю, невозможно полностью предотвратить взаимоблокировку транзакции.

Я хотел бы иметь транзакцию, которая никогда не терпит сбоев с точки зрения кода приложения. Итак, я видел, как этот шаблон используется для Microsoft SQL, и мне интересно, хорошая ли это идея?


    DECLARE @retry  tinyint
    SET @retry  = 5
    WHILE @retry >0
    BEGIN
      BEGIN TRANSACTION
      BEGIN TRY
        // do transaction her
        COMMIT
        BREAK
      END TRY
      BEGIN CATCH
        ROLLBACK

        if (ERROR_NUMBER() = 1205 OR ERROR_NUMBER() = 1222)
        BEGIN
          SET @retry = @retry - 1
          IF @retry = 0
             RAISEERROR('Could not complete transaction',16,1);
          WAITFOR DELAY '00:00:00.05' -- Wait for 50 ms
          CONTINUE
        END
        ELSE
        BEGIN
          RAISEERROR('Non-deadlock condition encountered',16,1);
          BREAK;
        END
      END CATCH;
    END
10
задан skyde 21 June 2016 в 22:45
поделиться