背景
當用戶并發(fā)嘗試訪問同一數(shù)據(jù)的時,SQL Server嘗試用鎖來隔離不一致的數(shù)據(jù)和使用隔離級別查詢數(shù)據(jù)時控制一致性(數(shù)據(jù)該如何讀取),說起鎖就會聯(lián)想到事務,事務是一個工作單元,包括查詢/更新數(shù)據(jù)和數(shù)據(jù)定義。
鎖
鎖類型
在SQL Server中,根據(jù)資源的不同,鎖分為以下三種類型:
行鎖:是SQL Server中數(shù)據(jù)級別中粒度最小的鎖級別,行鎖根據(jù)表是否存在聚集索引,分為鍵值鎖和標識鎖
頁鎖:針對某個數(shù)據(jù)頁添加的鎖,在T-SQL語句中,使用了頁鎖就不會在使用相同類型的行鎖,反之依然,在對數(shù)據(jù)頁加鎖后,無法在對其添加不兼容的鎖
表鎖:添加表鎖則無法添加與其不兼容的頁?鎖和行鎖
鎖模式
共享鎖(S):發(fā)生在數(shù)據(jù)查找之前,多個事務的共享鎖之間可以共存
排他鎖(X):發(fā)生在數(shù)據(jù)更新之前,排他鎖是一個獨占鎖,與其他鎖都不兼容
更新鎖(U):發(fā)生在更新語句中,更新鎖用來查找數(shù)據(jù),當查找的數(shù)據(jù)不是要更新的數(shù)據(jù)時轉(zhuǎn)化為S鎖,當是要更新的數(shù)據(jù)時轉(zhuǎn)化為X鎖
意向鎖:發(fā)生在較低粒度級別的資源獲取之前,表示對該資源下低粒度的資源添加對應的鎖,意向鎖有分為:意向共享鎖(IS) ,意向排他鎖(IX),意向更新鎖(IU),共享意向排他鎖(SIX),共享意向更新鎖(SIU),更新意向排他鎖(UIX)
共享鎖/排他鎖/更新鎖一般作用在較低級別上,例如數(shù)據(jù)行或數(shù)據(jù)頁,意向鎖一般作用在較高的級別上,例如數(shù)據(jù)表或數(shù)據(jù)。鎖是有層級結構的,若在數(shù)據(jù)行上持有排他鎖的時候,則會在所在的數(shù)據(jù)頁上持有意向排他鎖. 在一個事務中,可能由于鎖持有的時間太長或個數(shù)太多,出于節(jié)約資源的考慮,會造成鎖升級
除了上述的鎖之外,還有幾個特殊類型的鎖,例如架構鎖,架構鎖包含兩種模式,架構穩(wěn)定鎖(Sch-S)和架構更新鎖(Sch-M) ,架構穩(wěn)定鎖用來穩(wěn)定架構,當查詢表數(shù)據(jù)的時候,會對表添加架構穩(wěn)定鎖,防止架構發(fā)生改變。當執(zhí)行DDL語句的時候,會使用架構更新鎖,確保沒有任何資源對表的占用。大數(shù)據(jù)量的表避免執(zhí)行DDL操作,這樣會造成架構更新鎖長時間占用資源,影響其他操作,除非必要不然不要執(zhí)行DDL語句,如在必要的情況下添加字段,需要先給字段初始化,在設置為非空。
鎖的兼容性
如何查看一個事務中所請求的鎖類型和鎖的順序,可使用SQL Profiler 查看 Mode 屬性
數(shù)據(jù)準備
網(wǎng)友評論