0
最近,在我們村,我們注意到在某些集的存儲過程死鎖的增加,這些都是很簡單:重試查詢
- 插入表在表
- 更新記錄基礎在主鍵
這個表有太多觸發器和這些ocasionally與另一個存儲過程,即以小時爲單位運行衝突,並導致死鎖。
我周圍的Googling跌跌撞撞這篇文章後:https://www.simple-talk.com/sql/database-administration/handling-deadlocks-in-sql-server/
它建議以下模式來處理死鎖程序:
DECLARE @retries INT ;
SET @retries = 4 ;
WHILE (@retries > 0)
BEGIN
BEGIN TRY
BEGIN TRANSACTION ;
-- place sql code here
SET @retries = 0 ;
COMMIT TRANSACTION ;
END TRY
BEGIN CATCH
-- Error is a deadlock
IF (ERROR_NUMBER() = 1205)
SET @retries = @retries - 1 ;
-- Error is not a deadlock
ELSE
BEGIN
DECLARE @ErrorMessage NVARCHAR(4000) ;
DECLARE @ErrorSeverity INT ;
DECLARE @ErrorState INT ;
SELECT @ErrorMessage = ERROR_MESSAGE() ,
@ErrorSeverity = ERROR_SEVERITY() ,
@ErrorState = ERROR_STATE() ;
-- Re-Raise the Error that caused the problem
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
) ;
SET @retries = 0 ;
END
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION ;
END CATCH ;
END ;
GO
它幾乎使代碼的第二,第三和第四的成功機會和只有然後拋出一個錯誤。
我的問題是,這是否是一種健康的模式來處理前沿情況下的死鎖,並且是一種實際的解決方案而不是解決問題的方法?
這就是我實際上認爲我自己。現在我想消除它們並閱讀更多文獻。一切都很糾結,以迅速解決問題。 –