您好,登錄后才能下訂單哦!
SQL Server可以鎖定的資源類型
SQL Server可以鎖定不同類型的資源。這些可以被鎖定的資源類型包括:RIDs或鍵(keys)(行級(jí)別),頁(yè)(pages),對(duì)象(objects)(例如,表),數(shù)據(jù)庫(kù)(databases)和其他。行位于頁(yè)中,而也是包含表或索引數(shù)據(jù)的物理數(shù)據(jù)塊。你首先應(yīng)該熟悉這些資源類型,到更高級(jí)的階段,你可能會(huì)要熟悉其他鎖定資源類型,像盤區(qū)(extents),分配單元(allocation units),堆(heaps)或B樹(B-trees)。
為了獲得一個(gè)特定資源類型的鎖,你的事務(wù)必需首先獲得更高粒度級(jí)別上的相同模式的意向鎖。例如,為了獲得一個(gè)行上的排它鎖,你的事務(wù)必需首先在行位于的頁(yè)上申請(qǐng)意向排它鎖和擁有頁(yè)的對(duì)象上的意向排它鎖。類似的,為了獲得一個(gè)特定粒度級(jí)別上的共享鎖,你的事務(wù)必需首先在更高粒度級(jí)別上申請(qǐng)一個(gè)意向共享鎖。意向鎖的目的是在更高的粒度級(jí)別上有效地檢測(cè)到不兼容鎖請(qǐng)求并阻止授予它們。例如,一個(gè)事務(wù)持有一個(gè)行鎖,而另一個(gè)事務(wù)在行位于的整個(gè)頁(yè)或表上請(qǐng)求一個(gè)不兼容的鎖模式,因?yàn)榈谝粋€(gè)事務(wù)在頁(yè)和表上獲得的意向鎖,對(duì)于SQL Server很容易識(shí)別沖突。意向鎖不會(huì)干擾行級(jí)別粒度上的鎖請(qǐng)求。例如,一個(gè)頁(yè)上的意向鎖不會(huì)阻止其它事務(wù)在該頁(yè)的行上獲得不兼容的鎖模式。
鎖兼容性表如下:
請(qǐng)求模式 | 授予了排它鎖(X) | 授予了共享鎖(S) | 授予了意向排它鎖(IX) | 授予了意向共享鎖(IS) |
是否授予排它鎖請(qǐng)求? | 否 | 否 | 否 | 否 |
是否授予共享鎖請(qǐng)求? | 否 | 是 | 否 | 是 |
是否授予意向排它鎖請(qǐng)求? | 否 | 否 | 是 | 是 |
是否授予意向共享鎖請(qǐng)求? | 否 | 是 | 是 | 是 |
SQL Server動(dòng)態(tài)決定鎖定哪個(gè)資源類型。當(dāng)然,對(duì)于理想的并發(fā),最好只鎖定需要鎖定的資源,也就是只鎖定影響的行。然而,鎖定需要內(nèi)存資源和內(nèi)部管理開銷。因此,當(dāng)SQL Server選擇鎖定哪個(gè)資源類型時(shí),要同時(shí)考慮并發(fā)和系統(tǒng)資源。
SQL Server會(huì)首先申請(qǐng)細(xì)粒度的(fine-grained)鎖(像行或頁(yè)鎖),在一定情況下,嘗試升級(jí)細(xì)粒度的鎖到更粗粒度(coarse-grained)鎖(像表鎖)。例如,當(dāng)一條語(yǔ)句獲得至少5000個(gè)鎖,然后對(duì)于每1250個(gè)新鎖,如果之前嘗試鎖升級(jí)不成功,那么鎖升級(jí)(lock escalation)被觸發(fā)。
在SQL Server 2008和SQL Server 2012,你可以通過(guò)使用ALTER TABLE語(yǔ)句設(shè)置一個(gè)表選項(xiàng),來(lái)控制鎖升級(jí)的行為方式。如果你喜歡,也可以禁用鎖升級(jí),或者決定在表級(jí)別(默認(rèn))或者分區(qū)級(jí)別發(fā)生鎖升級(jí)。(一個(gè)表可以被物理組織到多個(gè)更小的單元叫做分區(qū)。)
翻譯自
Itzik Ben-Gan
Microsoft SQL Server 2012 T-SQL Fundamentals
Page 302
Lockable Resource Types
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。