前段时间,我写了一些SQL Server里锁升级的基础知识,还有它是如何影响执行计划的。今天,我想进一步谈下锁升级:

锁升级什么时候发生?

通常在SQL Server里如果在SQL语句里你请求的行数超过5000(SELECT,INSERT,UPDATE,DELETE)会发生锁升级。例如当你再可重复读隔离级别(Repeatable Read Isolation Level)里,从表你读超过5000行数据,锁升级就会被SQL Server触发。

当你对超过5000行的数据运行UPDATE和DELETE语句,也会触发锁升级。作为副作用,最终你有一个共享(S)或排它(X)表锁。这肯定会伤及你的并发,降低性能和你工作负载的吞吐量。

“阻塞”锁升级

锁升级的整个想法听起来很简单,但会有大影响和副作用:如果你不能获得共享或排它表锁会发生什么,因为其他人在表上获得了不兼容的锁?在这个情况下,锁升级应该阻塞么?希望不是......

因此我们来构建一个简单的例子,在这里我们尝试重现这个情况来看下载这个特定情况下,SQL Server如何反应。下列查询在Person.Person表里聚集索引里的最后一行请求一个X锁。

-- This transaction locks the last row in the Clustered Index of the
-- table Person.Person
BEGIN TRANSACTION UPDATE Person.Person
SET LastName = '...'
WHERE BusinessEntityID = 20777

这也意味着SQL Server在对应的页和表本身会获得意向排它锁(Intent Exclusive Lock (IX))。现在假设你再可重复读隔离级别运行SELECT语句,并且你请求超过5000行级别锁。在这个情况下,SQL Server需要触发锁升级,升级各个共享锁到表级别的共享锁。

但在我们的情况下不能在表级别获得共享锁,因为共享锁已经已经为我们UPDATE语句授予的IX锁不兼容。这个锁层级是有道理的,因为其他人已经造门锁层级里获得了不兼容的X锁。因此我们从Person.Person表的聚集索引SELECT前6000行数据。

-- This statement would trigger a Lock Escalation
-- Run this in a different session...
BEGIN TRANSACTION SELECT TOP(6000) * FROM Person.Person WITH (HOLDLOCK)

幸运的是,这个SELECT语句没有阻塞!还不错!在我们的例子里,SQL Server尝试进行锁升级,但放弃了,因为在表层级上有一个不兼容的锁(IX)。如果锁升级阻塞的话,情况会更加糟糕,因为这会无故降低并行查询的并发!

小结:

在SQL Server里锁升级非常重要,因为它们帮助SQL Server节约里在锁管理器里的哈希表空间。但锁升级只被SQL Server“尝试”。如果SQL Server不能进行锁升级,因为在表层级有不兼容的锁,什么也不会发生。锁升级不能占用空间,触发锁升级的SQL语句也不会阻塞。

希望这个特定场景可以帮你更好的理解SQL Server里的锁升级行为。

原文链接:

https://www.sqlpassion.at/archive/2016/05/09/lock-escalations-do-they-always-happen/

锁升级(Lock Escalations)——它们经常发生么?的更多相关文章

  1. (转)DB2性能优化 – 如何通过调整锁参数优化锁升级

    原文:http://blog.51cto.com/5063935/2074306 1.概念描述 所谓的锁升级(lock escalation),是数据库的一种作用机制,为了节约内存的开销, 其会将为数 ...

  2. 第19/24周 锁升级(Lock Escalations)

    大家好,欢迎回到性能调优培训.上2个星期我们已经讨论了SQLServer里的悲观和乐观锁.今天我想谈下SQL Server里对于锁的一个特殊现象:所谓的锁升级(Lock Escalations).在我 ...

  3. SQL Server Lock Escalation - 锁升级

    Articles Locking in Microsoft SQL Server (Part 12 – Lock Escalation) http://dba.stackexchange.com/qu ...

  4. MySQL 锁(lock与latch)

    一.什么是锁 锁机制用于管理对共享资源的并发访问,它是数据库系统区别于文件系统的一个关键特性. 数据库系统使用锁是为了支持对共享资源的并发访问,提供数据的完整性和一致性. InnoDB存储引擎锁的实现 ...

  5. 深入并发锁,解析Synchronized锁升级

    这篇文章分为六个部分,不同特性的锁分类,并发锁的不同设计,Synchronized中的锁升级,ReentrantLock和ReadWriteLock的应用,帮助你梳理 Java 并发锁及相关的操作. ...

  6. 关于Synchronized的偏向锁,轻量级锁,重量级锁,锁升级过程,自旋优化,你该了解这些

    前言 相信大部分开发人员,或多或少都看过或写过并发编程的代码.并发关键字除了Synchronized(如有不懂请移至传送门,关于Synchronized的偏向锁,轻量级锁,重量级锁,锁升级过程,自旋优 ...

  7. synchronized与锁升级

    1 为什么需要synchronized? 当一个共享资源有可能被多个线程同时访问并修改的时候,需要用锁来保证数据的正确性.请看下图: 线程A和线程B分别往同一个银行账户里面添加货币,A线程从内存中读取 ...

  8. java里的锁总结(synchronized隐式锁、Lock显式锁、volatile、CAS)

    一.介绍 首先, java 的锁分为两类: 第一类是 synchronized 同步关键字,这个关键字属于隐式的锁,是 jvm 层面实现,使用的时候看不见: 第二类是在 jdk5 后增加的 Lock ...

  9. Java线程安全与锁优化,锁消除,锁粗化,锁升级

    线程安全的定义 来自<Java高并发实战>"当多个线程访问一个对象的时候,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法的时候进行任何 ...

随机推荐

  1. front end about mobile web techs

    WEB OF DEVICES http://www.w3.org/standards/webofdevices/ MOBILE WEB http://www.w3.org/standards/webd ...

  2. SQL 2008升级SQL 2008 R2完全教程或者10.00.1600升级10.50.1600

    http://blog.csdn.net/feng19821209/article/details/8571571 SQL 2008升级SQL 2008 R2完全教程或者10.00.1600升级10. ...

  3. Chrome必备的扩展

    Devtools Terminal ——浏览器终端.牛逼的不得了! LiveReload——为官方 LiveReload 应用程序(Mac 和 Windows)和第三方,例如 guard-livere ...

  4. The easy way to implement a Red-Black tree

    Red-Black trees are notorious for being nightmares of pointer manipulation. Instructors will show th ...

  5. SQL Server2014 哈希索引原理

    SQL Server2014 哈希索引原理 翻译自:http://www.sqlservercentral.com/blogs/sql-and-sql-only/2015/09/08/hekaton- ...

  6. eventbus 备注

    Event在整个系统中是单例的. EventBus.getDefault().register(this); 注册 EventBus.getDefault().unregister(this); 注销 ...

  7. MySQL 分区介绍总结

    200 ? "200px" : this.width)!important;} --> 介绍 分区是指根据一定的规则将一个大表分解成多个更小的部分,这里的规则一般就是利用分区 ...

  8. 现代程序设计 网页前端开发作业(to 邹欣老师)

    在一些著名的网站的搜索框上,会有一种“自动完成”功能. 比如google.百度和淘宝: 现在,我们来考虑如何实现这个功能. 第一步:模仿任意一个网站,编写一个类似的网页效果原型. 在这一步,不要估计开 ...

  9. linux split 及优化

    split 虽然不好用, 但是还是可以用一下的! 有两个方式拆分, 按固定的行数, 按固定的大小. 默认是 1000 行, 后缀长度为2, 后缀长度N是说, 分片从N个字母/数字 的最小值 到 其最大 ...

  10. 2013 duilib入门简明教程 -- 自绘标题栏(5)

        如果大家有做过标题栏的自绘,肯定会感慨各种不容易,并且现有的一些资料虽然完美的实现了功能,但是代码比较乱,需要自行整理.如果用duilib,就是小case啦.     duilib其实并没有区 ...