首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

SQL Server 2005死鎖解決方案:TRY...CATCH重試機制實戰

     編輯:PHP 相關知識

死鎖問題本質

並發事務互相持有鎖並請求對方持有的鎖,形成循環等待。SQL Server會選擇犧牲者拋出錯誤1205並回滾。

SQL Server 2000局限

T-SQL無法捕獲異常,死鎖發生後腳本終止,無法實現重試邏輯。

SQL Server 2005解決方案:TRY...CATCH重試

SET XACT_ABORT ON;
DECLARE @retry INT = 1, @maxRetry INT = 3;

WHILE @retry <= @maxRetry
BEGIN
  BEGIN TRAN;
  BEGIN TRY
    INSERT INTO Orders(CustomerId) VALUES('ALFKI');
    WAITFOR DELAY '00:00:05';
    SELECT * FROM Orders WHERE CustomerId = 'ALFKI';
    COMMIT;
    BREAK; -- 成功跳出循環
  END TRY
  BEGIN CATCH
    ROLLBACK;
    WAITFOR DELAY '00:00:03'; -- 關鍵:等待減少衝突
    SET @retry += 1;
    CONTINUE;
  END CATCH;
END;

進階:錯誤重拋與監控

超過重試次數後使用RAISERROR重新拋出原始錯誤信息,避免錯誤被吞沒:

IF @retry > @maxRetry
BEGIN
  DECLARE @msg NVARCHAR(2048) = ERROR_MESSAGE();
  RAISERROR(@msg, 16, 1);
END

最佳實踐總結

  • 保持事務簡短,縮小鎖持有時間
  • 統一訪問表的順序
  • 適當設置重試次數與等待間隔
  • 記錄死鎖日誌供事後分析
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved