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