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

SQL Server 7.0 中 SET LOCK_TIMEOUT 非持久化特性與死鎖預防正確策略

     編輯:關於SqlServer

問題現象

嘗試使用 SET LOCK_TIMEOUT 3000 讓死鎖等待 3 秒後自動終止,但連線一段時間後設定自動還原為 -1 (無限等待)。

根本原因

SET LOCK_TIMEOUT 是連線層級設定:

  • 每次新連線預設為 -1
  • 設定後僅對目前連線生效
  • 連線關閉即失效,無法全域持久化

正確的死鎖處理策略

1. 應用層面(根治)

  • 統一資源存取順序(避免循環等待)
  • 縮短交易範圍、降低隔離層級(如可接受 Read Committed)
  • 避免長時間交易中進行使用者互動
  • 使用 TRY...CATCH (SQL 2005+) 捕捉 1205 錯誤並重試

2. 資料庫層面

  • 啟用 死鎖追蹤旗標 1222/1204 記錄詳細資訊分析
  • 優化索引減少鎖定範圍
  • 考慮 READ_COMMITTED_SNAPSHOT (SQL 2005+) 減少讀寫衝突

3. 連線字串/驅動程式層面(若必須設定逾時)

  • ADO.NET:SqlConnection.ConnectionTimeout (連線逾時) + 命令層級 CommandTimeout
  • ODBC/OLE DB:連線屬性 SQL_ATTR_QUERY_TIMEOUT
  • 應用程式啟動時對每條連線執行 SET LOCK_TIMEOUT 3000

總結

SET LOCK_TIMEOUT 無法全域永久生效。
死鎖根治在於應用邏輯設計(存取順序、交易長度、隔離層級),而非依賴逾時終止。逾時僅是安全網,不能替代正確的並發控制設計。

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