談談mssql鎖機制鎖的概述
一. 為什麼要引入鎖
多個使用者同時對資料庫的併發操作時會帶來以下資料不一致的問題:
丟失更新
a,b兩個使用者讀同一資料並進行修改,其中乙個使用者的修改結果破壞了另乙個修改的結果,比如訂票系統
髒讀a使用者修改了資料,隨後b使用者又讀出該資料,但a使用者因為某些原因取消了對資料的修改,資料恢復原值,此時b得到的資料就與資料庫內的資料產生了不一致
不可重複讀
a使用者讀取資料,隨後b使用者讀出該資料並修改,此時a使用者再讀取資料時發現前後兩次的值不一致
併發控制的主要方法是封鎖,鎖就是在一段時間內禁止使用者做某些操作以避免產生資料不一致
二 鎖的分類
鎖的類別有兩種分法:
1. 從資料庫系統的角度來看:分為獨佔鎖(即排它鎖),共享鎖和更新鎖
ms-sql server 使用以下資源鎖模式。
鎖模式 描述
共享 (s) 用於不更改或不更新資料的操作(唯讀操作),如 select 語句。
更新 (u) 用於可更新的資源中。防止當多個會話在讀取、鎖定以及隨後可能進行的資源更新時發生常見形式的死鎖。
排它 (x) 用於資料修改操作,例如 insert、update 或 delete。確保不會同時同一資源進行多重更新。
意向鎖 用於建立鎖的層次結構。意向鎖的型別為:意向共享 (is)、意向排它 (ix) 以及與意向排它共享 (six)。
架構鎖 在執行依賴於表架構的操作時使用。架構鎖的型別為:架構修改 (sch-m) 和架構穩定性 (sch-s)。
大容量更新 (bu) 向表中大容量複製資料並指定了 tablock 提示時使用。
共享鎖共享 (s) 鎖允許併發事務讀取 (select) 乙個資源。資源上存在共享 (s) 鎖時,任何其它事務都不能修改資料。一旦已經讀取資料,便立即釋放資源上的共享 (s) 鎖,除非將事務隔離級別設定為可重複讀或更高階別,或者在事務生存週期內用鎖定提示保留共享 (s) 鎖。
更新鎖更新 (u) 鎖可以防止通常形式的死鎖。一般更新模式由乙個事務組成,此事務讀取記錄,獲取資源(頁或行)的共享 (s) 鎖,然後修改行,此操作要求鎖轉換為排它 (x) 鎖。如果兩個事務獲得了資源上的共享模式鎖,然後試圖同時更新資料,則乙個事務嘗試將鎖轉換為排它 (x) 鎖。共享模式到排它鎖的轉換必須等待一段時間,因為乙個事務的排它鎖與其它事務的共享模式鎖不相容;發生鎖等待。第二個事務試圖獲取排它 (x) 鎖以進行更新。由於兩個事務都要轉換為排它 (x) 鎖,並且每個事務都等待另乙個事務釋放共享模式鎖,因此發生死鎖。
若要避免這種潛在的死鎖問題,請使用更新 (u) 鎖。一次只有乙個事務可以獲得資源的更新 (u) 鎖。如果事務修改資源,則更新 (u) 鎖轉換為排它 (x) 鎖。否則,鎖轉換為共享鎖。
排它鎖排它 (x) 鎖可以防止併發事務對資源進行訪問。其它事務不能讀取或修改排它 (x) 鎖鎖定的資料。
意向鎖意向鎖表示 sql server 需要在層次結構中的某些底層資源上獲取共享 (s) 鎖或排它 (x) 鎖。例如,放置在表級的共享意向鎖表示事務打算在表中的頁或行上放置共享 (s) 鎖。在表級設定意向鎖可防止另乙個事務隨後在包含那一頁的表上獲取排它 (x) 鎖。意向鎖可以提高效能,因為 sql server 僅在表級檢查意向鎖來確定事務是否可以安全地獲取該錶上的鎖。而無須檢查表中的每行或每頁上的鎖以確定事務是否可以鎖定整個表。
意向鎖包括意向共享 (is)、意向排它 (ix) 以及與意向排它共享 (six)。
鎖模式 描述
意向共享 (is) 通過在各資源上放置 s 鎖,表明事務的意向是讀取層次結構中的部分(而不是全部)底層資源。
意向排它 (ix) 通過在各資源上放置 x 鎖,表明事務的意向是修改層次結構中的部分(而不是全部)底層資源。ix 是 is 的超集。
與意向排它共享 (six) 通過在各資源上放置 ix 鎖,表明事務的意向是讀取層次結構中的全部底層資源並修改部分(而不是全部)底層資源。允許頂層資源上的併發 is 鎖。例如,表的 six 鎖在表上放置乙個 six 鎖(允許併發 is 鎖),在當前所修改頁上放置 ix 鎖(在已修改行上放置 x 鎖)。雖然每個資源在一段時間內只能有乙個 six 鎖,以防止其它事務對資源進行更新,但是其它事務可以通過獲取表級的 is 鎖來讀取層次結構中的底層資源。
獨佔鎖:只允許進行鎖定操作的程式使用,其他任何對他的操作均不會被接受。執行資料更新命令時,sql server會自動使用獨佔鎖。當物件上有其他鎖存在時,無法對其加獨佔鎖。
共享鎖:共享鎖鎖定的資源可以被其他使用者讀取,但其他使用者無法修改它,在執行select時,sql server會對物件加共享鎖。
更新鎖:當sql server準備更新資料時,它首先對資料物件作更新鎖鎖定,這樣資料將不能被修改,但可以讀取。等到sql server確定要進行更新資料操作時,他會自動將更新鎖換為獨佔鎖,當物件上有其他鎖存在時,無法對其加更新鎖。
2. 從程式設計師的角度看:分為樂觀鎖和悲觀鎖。
樂觀鎖:完全依靠資料庫來管理鎖的工作。
悲觀鎖:程式設計師自己管理資料或物件上的鎖處理。
ms-sqlserver 使用鎖在多個同時在資料庫內執行修改的使用者間實現悲觀併發控制
三 鎖的粒度
鎖粒度是被封鎖目標的大小,封鎖粒度小則併發性高,但開銷大,封鎖粒度大則併發性低但開銷小
sql server支援的鎖粒度可以分為為行、頁、鍵、鍵範圍、索引、表或資料庫獲取鎖
資源 描述
rid 行識別符號。用於單獨鎖定表中的一行。
鍵 索引中的行鎖。用於保護可序列事務中的鍵範圍。
頁 8 千位元組 (kb) 的資料頁或索引頁。
擴充套件盤區 相鄰的八個資料頁或索引頁構成的一組。
表 包括所有資料和索引在內的整個表。
db 資料庫。
四 鎖定時間的長短
鎖保持的時間長度為保護所請求級別上的資源所需的時間長度。
根據為游標設定的併發選項,游標可以獲取共享模式的滾動鎖以保護提取。當需要滾動鎖時,直到下一次提取或關閉游標(以先發生者為準)時才釋放滾動鎖。但是,如果指定 holdlock,則直到事務結束才釋放滾動鎖。
用於保護更新的排它鎖將直到事務結束才釋放。
如果乙個連線試圖獲取乙個鎖,而該鎖與另乙個連線所控制的鎖衝突,則試圖獲取鎖的連線將一直阻塞到:
將衝突鎖釋放而且連線獲取了所請求的鎖。
連線的超時間隔已到期。預設情況下沒有超時間隔,但是一些應用程式設定超時間隔以防止無限期等待
全面了解MSSQL鎖機制以及應用
當使用者併發對資料庫進行操作時會帶來資料不一致的問題,例如 所以在出現使用者併發操作的時候,應該提供鎖,就是在一段時間內禁止使用者做某些操作以避免產生資料不一致。資料庫的讀寫的角度來分 分為獨佔鎖 即排它鎖 共享鎖和更新鎖 從程式的角度進行分 也就是經常會提到的樂觀鎖和悲觀鎖 鎖粒度是被封鎖目標的大...
MsSql檢視鎖資訊
檢視鎖資訊 create table t req spid int,obj name sysname declare s nvarchar 4000 rid int,dbname sysname,id int,objname sysname declare tb cursor for select ...
MS SQL 鎖與事務
ms sql 鎖與事務 加鎖的主要目的是為了防止併發操作時導致的資料不一致等問題,鎖分為共享鎖 s 更新鎖 u 排他鎖 x 共享鎖與更新只是單向相容?傳說中的單相思?事務事務能保證資料操作的原子性,要麼內部操作都提交,要麼都回退。事務內部某個地方出錯時,可以回滾前面的操作,比如更新 刪除等。複製 b...