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

SQL Server 2005 利用 TRY/CATCH 解決死鎖重試模式

     編輯:關於SqlServer

死鎖是高併發系統的常態。SQL Server 2005 引入 TRY...CATCH 結構,使死鎖捕獲與重試邏輯能在 T-SQL 內部優雅實現,無需應用層介入。

經典死鎖復現:讀寫互斥

兩連接並發執行:INSERT → WAITFOR DELAY → SELECT ... LIKE 'Test%'。READ COMMITTED 隔離級下,SELECT 需共享鎖,被對方 INSERT 的排他鎖阻塞,雙向等待形成死鎖。鎖管理器選擇犧牲品回滾,另一事務成功。

TRY/CATCH 死鎖重試範本

DECLARE @RetryCount INT = 0, @MaxRetries INT = 3
WHILE @RetryCount < @MaxRetries
BEGIN
  BEGIN TRY
    BEGIN TRANSACTION
      -- 業務邏輯:INSERT/UPDATE/DELETE/SELECT
      INSERT Authors VALUES (@au_id, @au_lname, ...)
      WAITFOR DELAY '00:00:05'
      SELECT * FROM authors WHERE au_lname LIKE 'Test%'
    COMMIT TRANSACTION
    BREAK -- 成功跳出循環
  END TRY
  BEGIN CATCH
    IF ERROR_NUMBER() = 1205 -- 死錯誤號
    BEGIN
      ROLLBACK TRANSACTION
      SET @RetryCount = @RetryCount + 1
      WAITFOR DELAY '00:00:00.1' -- 短暫延遲避免活鎖
      CONTINUE
    END
    ELSE
    BEGIN
      -- 非死鎖錯誤:記錄日誌、拋出、或按業務處理
      THROW
    END
  END CATCH
END

關鍵點總結

  • 僅捕獲錯誤號 1205(死鎖)進行重試,其他錯誤上拋
  • 重試次數上限防無限循環
  • 重試間加微小隨機延遲降低再次碰撞概率
  • 事務範圍最小化:只包含必須原子的操作
  • 配合 SET DEADLOCK_PRIORITY LOW 讓非關鍵任務主動讓步

此模式將死鎖從「異常中斷」轉為「可控重試」,顯著提升系統韌性與用戶體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved