锁升级(Lock Escalations)——它们经常发生么?
前段时间,我写了一些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)——它们经常发生么?的更多相关文章
- (转)DB2性能优化 – 如何通过调整锁参数优化锁升级
原文:http://blog.51cto.com/5063935/2074306 1.概念描述 所谓的锁升级(lock escalation),是数据库的一种作用机制,为了节约内存的开销, 其会将为数 ...
- 第19/24周 锁升级(Lock Escalations)
大家好,欢迎回到性能调优培训.上2个星期我们已经讨论了SQLServer里的悲观和乐观锁.今天我想谈下SQL Server里对于锁的一个特殊现象:所谓的锁升级(Lock Escalations).在我 ...
- SQL Server Lock Escalation - 锁升级
Articles Locking in Microsoft SQL Server (Part 12 – Lock Escalation) http://dba.stackexchange.com/qu ...
- MySQL 锁(lock与latch)
一.什么是锁 锁机制用于管理对共享资源的并发访问,它是数据库系统区别于文件系统的一个关键特性. 数据库系统使用锁是为了支持对共享资源的并发访问,提供数据的完整性和一致性. InnoDB存储引擎锁的实现 ...
- 深入并发锁,解析Synchronized锁升级
这篇文章分为六个部分,不同特性的锁分类,并发锁的不同设计,Synchronized中的锁升级,ReentrantLock和ReadWriteLock的应用,帮助你梳理 Java 并发锁及相关的操作. ...
- 关于Synchronized的偏向锁,轻量级锁,重量级锁,锁升级过程,自旋优化,你该了解这些
前言 相信大部分开发人员,或多或少都看过或写过并发编程的代码.并发关键字除了Synchronized(如有不懂请移至传送门,关于Synchronized的偏向锁,轻量级锁,重量级锁,锁升级过程,自旋优 ...
- synchronized与锁升级
1 为什么需要synchronized? 当一个共享资源有可能被多个线程同时访问并修改的时候,需要用锁来保证数据的正确性.请看下图: 线程A和线程B分别往同一个银行账户里面添加货币,A线程从内存中读取 ...
- java里的锁总结(synchronized隐式锁、Lock显式锁、volatile、CAS)
一.介绍 首先, java 的锁分为两类: 第一类是 synchronized 同步关键字,这个关键字属于隐式的锁,是 jvm 层面实现,使用的时候看不见: 第二类是在 jdk5 后增加的 Lock ...
- Java线程安全与锁优化,锁消除,锁粗化,锁升级
线程安全的定义 来自<Java高并发实战>"当多个线程访问一个对象的时候,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法的时候进行任何 ...
随机推荐
- 比achartengine更加强大的Android图表控件。
比achartengine更加强大的图表控件MPAndroidChart. 详细使用及demo:http://www.see-source.com/androidwidget/detail.html? ...
- 配置iis时,浏览项目提示 无法识别的属性“targetFramework”。请注意属性名称区分大小写。
无法识别的属性“targetFramework”.请注意属性名称区分大小写. 行 12: </appSettings>行 13: <system.web>行 14: ...
- sqlserver sp模板
某公司内部的sp模板 create procedure [usp_my_procedure_name] as begin set nocount on; declare @trancount int; ...
- 纯jQuery-添加/修改/删除 标签,属性
<h1>通过学习<精彩绝伦的jQuery>与W3C,大致了解JQuery的一些方法.</h1> PS:需要有一些前置条件,比如JQuery源代码,比如html就要有 ...
- JQ下的常见插件
插件的概述:插件是以 jQuery 的核心代码为基础,编写出复合一定规范的应用程序.也就是说,插件也是 jQuery 代码,通过 js 文件引入的方式植入即可. 插件的种类很多,达上千种,主要大致可以 ...
- 参数的元数据信息&数据库的元数据信息
package it.cast.jdbc; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql. ...
- 安装mysql
查看已安装的mysql,并删除它们 rpm -qa|grep -i mysql rpm -e --nodeps filename 如果重装mysql,查找安装mysql产生的文件,并删除它们 find ...
- Visual Studio中创建混合移动应用程序解决方案Xamarin Portable Razor
在Visual Studio中创建混合移动应用程序的一个解决方案是使用Xamarin Portable Razor工具,这是ASP.NET MVC API针对移动设备的一个轻量级实现.Xamarin编 ...
- [实践] Android5.1.1源码 - 让某个APP以解释执行模式运行
[实践] Android5.1.1源码 - 让某个APP以解释执行模式运行 作者:寻禹@阿里聚安全 前言 本文的实践修改了Android5.1.1的源码. 本文只简单的讲了一下原理.在“实践”一节 ...
- 使用ReSharper打造团队代码检查流程
首先我想跟大家分享一下我们团队的代码检查流程. 1. 项目经理随时会检查成员的代码,如果发现有不符合规范的代码,会在注释里面加todo.比如,假设leo的代码不符合规范,那么项目经理就会加注释: // ...