Из того, что я делаю, невозможно полностью предотвратить транзакцию от тупика.
Я хотел бы иметь транзакцию, которая никогда не сработает с точки зрения кода приложения. Таким образом, я видел, как этот шаблон используется для 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