誤區 #23: 鎖升級的過(guò)程是由行鎖升級到頁(yè)鎖,再由頁(yè)鎖升級到表鎖
錯誤
實(shí)際不是,在SQL Server 2005和之前的版本,鎖升級會(huì )直接升到表鎖。
在SQL Server 2005或SQL Server 2008,你可以通過(guò)如下跟蹤標志改變鎖升級的行為:
如果標志1211和1224跟蹤標志同時(shí)被設置了,只有標志1211會(huì )生效。更詳細的內容請看Books Online。
在SQL Server 2008中,還可以以表為單位進(jìn)行鎖行為的設置,可以通過(guò)ALTER TABLE blah SET (LOCK_ESCALATION = XXX),在這個(gè)命令中XXX所代表的是下面幾項中的一項:
TABLE: 直接從行鎖升級到表鎖。
AUTO:如果存在表分區,則升級為分區鎖,但不會(huì )進(jìn)一步升級。
DISABLE:禁用鎖升級,這并不意味著(zhù)禁用表鎖,就像BOL(Books Online entry)中所說(shuō),在序列化隔離等級的條件下進(jìn)行表掃描等操作時(shí)還需要表鎖。
在2008年1月的時(shí)候,我寫(xiě)了一篇包含分區鎖例子的博文,請看:SQL Server 2008: Partition-level lock escalation details and examples。
或許你會(huì )想為什么LOCK_ESCALATION = XXX設置中AUTO不是默認值,這時(shí)因為早期測試中某些人發(fā)現這個(gè)選項更容易引起死鎖。就像對于上述兩個(gè)有關(guān)鎖的跟蹤標記一樣,對于這個(gè)選項設置為AUTO也同樣需要謹慎。
聯(lián)系客服