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

MS SQL 入門基礎:資料庫鎖機制完整教學 (概念、類型、隔離級別、觀察工具)

     編輯:關於SqlServer

鎖是多使用者資料庫環境中協調並發存取、保證資料一致性的核心機制。本文系統介紹 SQL Server 的鎖概念、鎖對象、三大鎖類型、程式設計師視角的樂觀/悲觀鎖、四大隔離級別與觀察工具。

11.5.1 鎖的概念與可鎖定對象

鎖是對資源存取的限制。SQL Server 可鎖定以下層級對象 (由細到粗):

  • 資料列 - 數據頁中的單行
  • 索引鍵 - 索引頁中的單行 (鍵值)
  • 頁 - 8KB 儲存基本單位
  • 區 - 8 個連續頁
  • 表
  • 資料庫

11.5.2 鎖的類別

(1) 系統視角:三大基礎鎖類型

鎖類型相容性觸發場景釋放時機
獨佔鎖與所有鎖不相容INSERT/UPDATE/DELETE交易結束 (COMMIT/ROLLBACK)
共享鎖與 S、U 相容;與 X 不相容SELECT 讀取讀取完成即釋放 (除非 HOLDLOCK/隔離級較高)
更新鎖與 S 相容;與 U、X 不相容UPDATE/DELETE 尋找階段確定修改升級為 X 鎖,持有至交易結束

(2) 程式設計師視角:樂觀鎖 vs 悲觀鎖

類型核心思想實現方式優點缺點
樂觀鎖假設衝突稀少,提交時檢查版本戳/時間戳/檢查和比對無鎖開銷,高並發讀取效能佳衝突時需重試,適用低衝突場景
悲觀鎖假設衝突常見,先鎖後用SELECT ... FOR UPDATE / UPDLOCK / 鎖提示強一致性,適合高衝突寫入並發度低,易死鎖,鎖開銷大

SQL Server 預設行為偏悲觀 (自動加鎖),但可透過 `READ_COMMITTED_SNAPSHOT` 實現樂觀讀取。

11.5.3 隔離級別

隔離級別定義交易對其他交易修改的可見度,等同於鎖定行為的預設規則。

隔離級別髒讀不可重複讀幻影讀鎖行為特徵
READ UNCOMMITTED允許允許允許不發共享鎖 (相當 NOLOCK)
READ COMMITTED (預設)禁止允許允許發共享鎖,讀完即釋放
REPEATABLE READ禁止禁止允許共享鎖持有至交易結束
SERIALIZABLE禁止禁止禁止範圍鎖 (Key-Range),最高隔離

設定語法


SET TRANSACTION ISOLATION LEVEL READ COMMITTED;  -- 或 READ UNCOMMITTED / REPEATABLE READ / SERIALIZABLE

也可在單一查詢用鎖提示覆寫:`SELECT * FROM T WITH (NOLOCK)` 等。

11.5.4 觀察鎖的工具

(1) 企業管理器 / SSMS 活動監視器

  • 路徑:管理 → 目前活動 → 鎖/處理序 ID 或 鎖/對象
  • 右鍵進程 → 屬性 → 可刷新、終止進程 (KILL spid)

活動監視器鎖視圖 鎖進程細節對話框

(2) 系統預存程序 sp_lock


EXEC sp_lock [spid];  -- spid 可從 master.dbo.sysprocesses 查詢,省略則顯示所有鎖

sp_lock 輸出範例

(3) 現代 DMV (推薦 SQL Server 2005+)


SELECT
    request_session_id AS SPID,
    resource_type,
    resource_description,
    request_mode,
    request_status,
    OBJECT_NAME(resource_associated_entity_id) AS ObjectName
FROM sys.dm_tran_locks;

11.5.5 死鎖與防止

死鎖:多進程互相持有資源並請求對方資源,形成環狀等待。SQL Server 死鎖偵測器定期掃描,選擇「犧牲成本最低」的受害者回滾,回傳錯誤 1205。

防止死鎖四原則

  1. 盡量避免並發執行修改資料的陳述式。
  2. 要求每個交易一次取得所有需用資源的鎖,否則不執行 (全有或全無)。
  3. 預先規定封鎖順序:所有交易按相同順序鎖定對象 (如先 Table A 再 Table B)。
  4. 縮短交易執行時間,長交易拆分為多個短交易。

本章小結

理解鎖粒度、三大基礎鎖類型、隔離級別對應的鎖行為、觀察工具與死鎖防範原則,是撰寫高並發、高可靠資料庫應用的必修課。除本章 DML 更新外,尚可透過檢視表更新資料,詳見第 13 章「游標與檢視表」。

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