程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server誤區:有關鎖升級的誤區

SQL Server誤區:有關鎖升級的誤區

編輯:關於SqlServer

誤區 #23: 鎖升級的過程是由行鎖升級到頁鎖,再由頁鎖升級到表鎖

錯誤

實際不是,在SQL Server 2005和之前的版本,鎖升級會直接升到表鎖。

在SQL Server 2005或SQL Server 2008,你可以通過如下跟蹤標志改變鎖升級的行為:

標志1211-完全禁止鎖升級,但鎖使用的內存會被限制在動態分配內存的60%,當超過這個值時,更多的鎖將會伴隨著內存溢出錯誤而失敗。

標志1224-禁止鎖升級,但內存使用超過40%時,會自動開啟鎖升級

如果標志1211和1224跟蹤標志同時被設置了,只有標志1211會生效。更詳細的內容請看Books Online。

在SQL Server 2008中,還可以以表為單位進行鎖行為的設置,可以通過ALTER TABLE blah SET (LOCK_ESCALATION = XXX),在這個命令中XXX所代表的是下面幾項中的一項:

TABLE: 直接從行鎖升級到表鎖。

AUTO:如果存在表分區,則升級為分區鎖,但不會進一步升級。

DISABLE:禁用鎖升級,這並不意味著禁用表鎖,就像BOL(Books Online entry)中所說,在序列化隔離等級的條件下進行表掃描等操作時還需要表鎖。

在2008年1月的時候,我寫了一篇包含分區鎖例子的博文,請看:SQL Server 2008: Partition-level lock escalation details and examples。

或許你會想為什麼LOCK_ESCALATION = XXX設置中AUTO不是默認值,這時因為早期測試中某些人發現這個選項更容易引起死鎖。就像對於上述兩個有關鎖的跟蹤標記一樣,對於這個選項設置為AUTO也同樣需要謹慎。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved