第23章 锁升级

转载自: Paul S. Randal 所写的一本叫CommonSQLServerMyths一书。

来源:Paul S. Randal 的博客:http://www.sqlskills.com/blogs/paul/

23/30:锁升级

另一个实际上被广为接受的观点。

23个神话:锁升级的过程是从行锁升级到页锁,然后从页锁升级到表锁。

      从来就没有这个说法。在SQL Server 2005或更早版本的锁升级向来都是直接升级成表锁的。

      在SQL Server 2005(或2008版本),你可以通过启用以下跟踪标志来改变锁升级的行为模式(如果你真的清楚并理解你这么做的目的):

  • 跟踪标志1211:完全禁用锁升级,并允许在动态分配内存增长到60%的锁住内存(32位基于非地址窗口化扩展插件(AWE),64位基于普通内存)。如此一来,当未来可能的锁在申请时,将抛出一个内存不够的错误。
  • 跟踪标志1224:当(数据库引擎)占用内存达40%的时候禁用锁升级,之后重新启用锁升级。

      当跟踪标记1211与1224同时设置时,1211的优先级比1224更高。所以这点需要相当小心。更多相关信息,请翻阅在线联机丛书。

      在SQL Server 2008版本中,你可以通过以下T-SQL语句,改变每张表的锁升级行为:

ALTER TABLE blah SET (LOCK_ESCALATION = XXX)

其中,XXX代表以下选择之一:

  • TABLE:总是直接升级成表锁。
  • AUTO:如果目标表是已分区表(或者分区表),锁将升级成分区级别的锁,之后不会在更进一步的升级成其他类型的锁。
  • DISABLE:禁用锁升级。正如联机丛书中锁说的那样,这个设置不表明会禁用该表的表锁。换句话说,该表上还是可能会发生表锁。一个表会有很多情况去申请表锁,比如在可序列化的隔离级别下对一张堆表进行全表扫描等等。

  回顾2008年一月份我所写的博客中的一个例子:创建(已)分区表,并展示了分区级别的锁升级行为。详细见see SQL Server 2008: Partition-level lock escalation details and examples.

  你也许会问到,为什么AUTO选项不是SQL Server 2008版本的默认选项?那是因为早期的使用者发现当他们启用该选项会使他们的应用程序产生死锁。所以在SQL Server 2008版本中,请慎重的使用锁升级跟踪标记的AUTO选项。

 

 


以下为原文截图:


 

 

 

posted on 2014-07-09 16:27  Neo_Sun  阅读(171)  评论(1编辑  收藏  举报