SQL Server 阻塞 死鎖說明與分析
阿新 • • 發佈:2019-02-18
《SQL Server 2008 查詢效能優化》
一、加鎖(locking)、阻塞(blocking)、死鎖(deadlock)定義 加鎖:用於管理多個連線的程序。當連線需要訪問一塊資料時,在這些資料上放置某種型別的鎖。 阻塞:指一個連線需要訪問一塊資料時,必須等待另一個連線的鎖解除。 死鎖:指兩個連線形成被稱為"僵局"的形式,它們互相等待對方的鎖解除。 在 SQL Server 中,每個連線都可以看作是一個單獨的會話。 二、資料庫鎖 1、鎖粒度 為了改善併發性,SQL Server 實現如下資源級別上的鎖粒度:
這種鎖在表或索引的單一頁面中維護,被標識為 PAG 鎖。當查詢請求一個頁面中的多行時,請求的所有行的一致性可以通過獲得單獨行上的 RID/KEY 鎖或整個頁面上的一個 PAG 鎖來維護。在查詢計劃中,鎖管理器確定獲得多個 RID/KEY 鎖的資源壓力,若果壓力比較大,鎖管理器請求一個 PAG 鎖來代替。
頁級鎖減少了鎖的開銷,增進了查詢的效能,但它阻塞了該頁面上所有行的訪問從而損害了資料庫的併發性。
(4)區級鎖
這種鎖在區(一組連續 8 個數據或索引頁面)上維護並且標識為 EXT 鎖。
如,這種鎖用於在一個表上執行 ALTER INDEX REBUILD 命令,並且該表從現有的區移動到新的區時。在這期間,區的完整性用 EXT 鎖來保護。
(5)堆或 B- 樹鎖
堆或 B- 樹鎖用於描述這兩種物件(堆 和 B- 樹)被加鎖的情況。這意味在一個無序的堆、沒有聚集索引的表上的鎖,或者一個 B- 樹物件上的鎖,通常指分割槽上的鎖。因為分割槽被跨多個檔案組儲存,每個都有自己的資料分配定義。它的操作類似於表級鎖,但是是在分割槽而不是表上進行。
(6)表級別
這是表上最高級別的鎖。在一個表上的表級鎖保留了對整個表及其所有索引的訪問。
在執行一個查詢時,鎖管理器若果確定獲取行級鎖或是頁級鎖的資源壓力較高,這時會直接為查詢獲取一個表級鎖。
(7)資料庫級鎖
當應用程式建立一個數據庫連線時,鎖管理器分配一個數據庫共享鎖給對應的 SPID。這阻止使用者意外地在其他使用者連線時卸掉或者恢復資料庫。
鎖級別不需要由使用者或資料庫管理員指定,鎖管理器會自動確定。在訪問少量行時,它一般首先行級鎖和鍵級鎖以提高併發性。若多個行級鎖的開銷變得很高時,鎖管理器會自動選擇合適的較高級別的鎖。
2、鎖模式
根據所請求的型別,SQL Server 在鎖定資源時使用不同的鎖模式,下面是注意的三種模式:
隔離級別與併發效能的關係: 設定隔離級別原則 優先將資料庫系統的隔離級別設定為 ReadCommitted(MSSQL 預設級別),它可以避免髒讀,並且有較好的併發性。 四、多個事務併發產生的問題
一、加鎖(locking)、阻塞(blocking)、死鎖(deadlock)定義 加鎖:用於管理多個連線的程序。當連線需要訪問一塊資料時,在這些資料上放置某種型別的鎖。 阻塞:指一個連線需要訪問一塊資料時,必須等待另一個連線的鎖解除。 死鎖:指兩個連線形成被稱為"僵局"的形式,它們互相等待對方的鎖解除。 在 SQL Server 中,每個連線都可以看作是一個單獨的會話。 二、資料庫鎖 1、鎖粒度 為了改善併發性,SQL Server 實現如下資源級別上的鎖粒度:
- 行(RID)
- 關鍵字(KEY)
- 頁面(PAG)
- 區(EXT)
- 堆或 B 樹(HoBT)
- 表(TAB)
- 資料庫(DB)
- 共享(S)
- 更新(U)
- 排他(X)
- 讀取需要修改的資料(加 U 鎖);
- 修改資料(加 X 鎖)。
- 阻止其他事務訪問修改之下的資源,這樣他們可以看到修改之前或之後的值,但不能是正在修改的值;
- 在需要時允許事務修改資源以安全地回滾到修改之前的原始值,因為沒有其他事務被允許同時修改資源。
- 未提交讀(READ UNCOMMITTED)
- 已提交讀(READ COMMITTED)
- 可重複讀(REPEATABLE READ)
- 可序列化(SERIALIZABLE)
- 已提交讀快照(已提交讀隔離的一部分)
- 快照
隔離級別與併發效能的關係: 設定隔離級別原則 優先將資料庫系統的隔離級別設定為 ReadCommitted(MSSQL 預設級別),它可以避免髒讀,並且有較好的併發性。 四、多個事務併發產生的問題
- 第一類丟失更新:撤銷一個事務時,把其他事務已提交的更新資料覆蓋
- 髒讀:一個事務讀到另一個事務未提交的更新資料
- 虛讀:一個事務讀到另一個事務已提交的新插入的資料
- 不可重複讀:一個事務讀到另一個事務已提交更新的資料
- 第二類丟失更新:一個事務覆蓋另一個事務已提交更新的資料(不可重複讀的特例)
- 第一類丟失更新:撤銷一個事務時,把其他事務已提交的更新資料覆蓋
- 髒讀:一個事務讀到另一個事務未提交的更新資料
- 虛讀:一個事務讀到另一個事務已提交的新插入的資料
- 不可重複讀:一個事務讀到另一個事務已提交更新的資料
- 第二類丟失更新:一個事務覆蓋另一個事務已提交更新的資料(不可重複讀的特例)