死鎖是高併發系統的常態。SQL Server 2005 引入 TRY...CATCH 結構,使死鎖捕獲與重試邏輯能在 T-SQL 內部優雅實現,無需應用層介入。
兩連接並發執行:INSERT → WAITFOR DELAY → SELECT ... LIKE 'Test%'。READ COMMITTED 隔離級下,SELECT 需共享鎖,被對方 INSERT 的排他鎖阻塞,雙向等待形成死鎖。鎖管理器選擇犧牲品回滾,另一事務成功。
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
SET DEADLOCK_PRIORITY LOW 讓非關鍵任務主動讓步此模式將死鎖從「異常中斷」轉為「可控重試」,顯著提升系統韌性與用戶體驗。