在SQL Server里我们为什么需要意向锁(Intent Locks)?
在1年前,我写了篇在SQL Server里为什么我们需要更新锁。今天我想继续这个讨论,谈下SQL Server里的意向锁,还有为什么需要它们。
SQL Server里的锁层级
当我讨论SQL Server里的锁升级时,我从SQL Server使用的锁层级开始题,在你读或修改你的数据的时候。

当你读取一条记录时,SQL Server默认请求一个共享锁(S),当你修改一条记录时,SQL Server请求一个排它锁(X)。这2个锁彼此不兼容,当你同时向读写一条记录时,会发生阻塞。
另外对于行级别的锁,在锁层级里,SQL Server也会在更高一层请求所谓的意向锁(Intent Locks):在页和表层级。SQL Server基于请求的行级别锁,请求下列的意向锁:
- 意向共享锁(Intent Shared Lock (IS)),当你在行层级有一个共享锁(S)
- 意向更新锁(Intent Update Lock (IU)),当你在行层级有一个更新锁(U)
- 意向排它锁(Intent Exclusive Lock (IX)),当你在行层级有一个排它锁(X)
因此当读或写你记录时,你总会获得如上图所示的锁层级。当SQL Server为什么使用这些意向锁呢?
SQL Server里的意向锁
从技术上来说,SQL Server并不真的需要意向锁。这和性能优化有关。我们来具体看下。有了意向锁,SQL Server表明在锁层级里更高层级上,你需要请求其他锁。意向共享锁(Intent Shared Lock)告诉SQL Server某个地方有共享锁(S)。对于意向更新锁(Intent Update Lock)或意向排它锁(Intent Exclusive Lock)也是一样,但这次SQL Server知道在某个地方有更新锁(Update Lock)或排它锁(Exclusive Lock)。这只是个标识,没别的。
但这个标识怎么帮助SQL Server性能优化?假设你再表层级请求一个排它锁(X)。在这个情况下,SQL Server需要知道在某个记录上是否有不兼容的锁(像共享锁(S)或更新锁(U))。没有意向锁,SQL Server需要检查每条记录来看是否有一个授予的不兼容锁。
但在表层级有意向共享锁(IS)的话,SQL Server马上知道在某个地方有授予的共享锁(S),因此在表层级不能请求排它锁(X)。这个就是SQL Server里存在意向锁的原因:在锁层级里,如果某个地方有不兼容的锁存在,可以让SQL Server快速查到。很简单,是不是?
小结
技术上,SQL Server不需要意向锁,因为它只表示在锁层级里,某个地方有一些其他特定类型的锁。当基于如果你想在页或表上请求特定的锁,SQL Server可以更高效的检查是否有不兼容的锁存在,还是需要有意向锁。
感谢关注!
原文链接:
https://www.sqlpassion.at/archive/2016/05/16/why-do-we-need-intent-locks-in-sql-server/
在SQL Server里我们为什么需要意向锁(Intent Locks)?的更多相关文章
- SQL Server里在文件组间如何移动数据?
平常我不知道被问了几次这样的问题:“SQL Server里在文件组间如何移动数据?“你意识到这个问题:你只有一个主文件组的默认配置,后来围观了“SQL Server里的文件和文件组”后,你知道,有多 ...
- SQL Server里的文件和文件组
在今天的文章里,我想谈下SQL Server里非常重要的话题:SQL Server如何处理文件的文件组.当你用CREATE DATABASE命令创建一个简单的数据库时,SQL Server为你创建2个 ...
- SQL Server里的闩锁介绍
在今天的文章里我想谈下SQL Server使用的更高级的,轻量级的同步对象:闩锁(Latch).闩锁是SQL Server存储引擎使用轻量级同步对象,用来保护多线程访问内存内结构.文章的第1部分我会介 ...
- 在SQL Server里为什么我们需要更新锁
今天我想讲解一个特别的问题,在我每次讲解SQL Server里的锁和阻塞(Locking & Blocking)都会碰到的问题:在SQL Server里,为什么我们需要更新锁?在我们讲解具体需 ...
- 在SQL Server里如何进行页级别的恢复
在今天的文章里我想谈下每个DBA应该知道的一个重要话题:在SQL Server里如何进行页级别还原操作.假设在SQL Server里你有一个损坏的页,你要从最近的数据库备份只还原有问题的页,而不是还原 ...
- SQL Server里强制参数化的痛苦
几天前,我写了篇SQL Server里简单参数化的痛苦.今天我想继续这个话题,谈下SQL Server里强制参数化(Forced Parameterization). 强制参数化(Forced Par ...
- SQL Server里ORDER BY的歧义性
在今天的文章里,我想谈下SQL Server里非常有争议和复杂的话题:ORDER BY子句的歧义性. 视图与ORDER BY 我们用一个非常简单的SELECT语句开始. -- A very simpl ...
- SQL Server里等待统计(Wait Statistics)介绍
在今天的文章里我想详细谈下SQL Server里的统计等待(Wait Statistics),还有她们如何帮助你立即为什么你的SQL Server当前很慢.一提到性能调优,对我来说统计等待是SQL S ...
- SQL Server里的INTERSECT ALL
在上一篇文章里,我讨论了INTERSECT设置操作的基础,它和INNER JOIN的区别,还有为什么需要好的索引设计支持.今天我想谈下SQL Server里并未实现的INTERSECT ALL操作. ...
随机推荐
- IEEE/ACM ASONAM 2014 Industry Track Call for Papers
IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM) 2014 In ...
- Git ignore UserInterfaceState.xcuserstate
1. 退出xcdoe, 打开终端(Terminal),进入到你的项目目录下 2. 在终端键入 git rm --cached [YourProjectName].xcodeproj/project. ...
- 【CSS3进阶】酷炫的3D旋转透视
之前学习 react+webpack ,偶然路过 webpack 官网 ,看到顶部的 LOGO ,就很感兴趣. 最近觉得自己 CSS3 过于薄弱,想着深入学习一番,遂以这个 LOGO 为切入口,好好研 ...
- 写一个脚本,自动启动tomcat
我的服务器是使用tomcat的,时不时tomcat的进程会突然结束掉,不知道为什么,从日志上看也没有任何可疑之处,貌似就这样突然没了,接下来的日志都是重新启动tomcat之后打印的了.原因找不到,但要 ...
- Javascript本质第一篇:核心概念
很多人在使用Javascript之前都至少使用过C++.C#或Java,面向对象的编程思想已经根深蒂固,恰好Javascript在语法上借鉴了Java,虽然方便了Javascript的入门,但要深入理 ...
- ASP.NET MVC学前篇之Lambda表达式、依赖倒置
ASP.NET MVC学前篇之Lambda表达式.依赖倒置 前言 随着上篇文章的阅读,可能有的朋友会有疑问,比如(A.Method(xxx=>xx>yy);)类似于这样的函数调用语句,里面 ...
- hibernate学习笔记之三 持久化的三种状态
Hibernate持久化对象有3中状态,瞬时对象(transientObjects),持久化对象(persistentObjects),离线对象(detachedObjects) 下图显示持久化三种状 ...
- 页面静态化技术Freemarker技术的介绍及使用实例.
一.FreeMarker简介 1.动态网页和静态网页差异 在进入主题之前我先介绍一下什么是动态网页,动态网页是指跟静态网页相对应的一种网页编程技术.静态网页,随着HTML代码的生成,页面的内容和显示效 ...
- Sql Server系列:排序函数
在SQL Server中有4个排序函数:ROW_NUMBER().RANK().DENSE_RANK()及NTILE()函数. 1. ROW_NUMBER()函数 ROW_NUMBER()函数为每条记 ...
- xcode常见错误处理
问题:xcode 7编译错误:bitcode is not supported on versions of iOS prior to 6.0 解决:Build Options | Enable Bi ...