在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)?的更多相关文章

  1. SQL Server里在文件组间如何移动数据?

    平常我不知道被问了几次这样的问题:“SQL  Server里在文件组间如何移动数据?“你意识到这个问题:你只有一个主文件组的默认配置,后来围观了“SQL Server里的文件和文件组”后,你知道,有多 ...

  2. SQL Server里的文件和文件组

    在今天的文章里,我想谈下SQL Server里非常重要的话题:SQL Server如何处理文件的文件组.当你用CREATE DATABASE命令创建一个简单的数据库时,SQL Server为你创建2个 ...

  3. SQL Server里的闩锁介绍

    在今天的文章里我想谈下SQL Server使用的更高级的,轻量级的同步对象:闩锁(Latch).闩锁是SQL Server存储引擎使用轻量级同步对象,用来保护多线程访问内存内结构.文章的第1部分我会介 ...

  4. 在SQL Server里为什么我们需要更新锁

    今天我想讲解一个特别的问题,在我每次讲解SQL Server里的锁和阻塞(Locking & Blocking)都会碰到的问题:在SQL Server里,为什么我们需要更新锁?在我们讲解具体需 ...

  5. 在SQL Server里如何进行页级别的恢复

    在今天的文章里我想谈下每个DBA应该知道的一个重要话题:在SQL Server里如何进行页级别还原操作.假设在SQL Server里你有一个损坏的页,你要从最近的数据库备份只还原有问题的页,而不是还原 ...

  6. SQL Server里强制参数化的痛苦

    几天前,我写了篇SQL Server里简单参数化的痛苦.今天我想继续这个话题,谈下SQL Server里强制参数化(Forced Parameterization). 强制参数化(Forced Par ...

  7. SQL Server里ORDER BY的歧义性

    在今天的文章里,我想谈下SQL Server里非常有争议和复杂的话题:ORDER BY子句的歧义性. 视图与ORDER BY 我们用一个非常简单的SELECT语句开始. -- A very simpl ...

  8. SQL Server里等待统计(Wait Statistics)介绍

    在今天的文章里我想详细谈下SQL Server里的统计等待(Wait Statistics),还有她们如何帮助你立即为什么你的SQL Server当前很慢.一提到性能调优,对我来说统计等待是SQL S ...

  9. SQL Server里的INTERSECT ALL

    在上一篇文章里,我讨论了INTERSECT设置操作的基础,它和INNER JOIN的区别,还有为什么需要好的索引设计支持.今天我想谈下SQL Server里并未实现的INTERSECT ALL操作. ...

随机推荐

  1. (转载)开始iOS 7中自动布局教程(一)

    这篇教程的前半部分被翻译出来很久了,我也是通过这个教程学会的IOS自动布局.但是后半部分(即本篇)一直未有翻译,正好最近跳坑翻译,就寻来这篇教程,进行翻译.前半部分已经转载至本博客,后半部分即本篇.学 ...

  2. 如何知道SQL Server机器上有多少个NUMA节点

    如何知道SQL Server机器上有多少个NUMA节点 文章出处: How can you tell how many NUMA nodes your SQL Server has? http://i ...

  3. SQL Server表分区的NULL值问题

    SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,但是本人觉得已经够用了 虽然MySQL支持四种分区类型:RANGE分区.LIST分区.HASH分区 ...

  4. Visual Studio “14” CTP 4

    微软发布于10月6日发布了Visual Studio "14"CTP 4,本次发布的更新主要包括:ASP.NET vNext runtime和一些工具的优化(ASP.NET vNe ...

  5. 解读ASP.NET 5 & MVC6系列(2):初识项目

    初识项目 打开VS2015,创建Web项目,选择ASP.NET Web Application,在弹出的窗口里选择ASP.NET 5 Website模板创建项目,图示如下: 我们可以看到,此时Web ...

  6. 编译可在Android上运行的qemu user mode

    前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码. 下文中的”NDK”若无特殊说明均指”Android NDK”. 下文中”$NDK ...

  7. 全新 Mac 安装指南(编程篇)(环境变量、Shell 终端、SSH 远程连接)

    注:本文专门用于指导对计算机编程与设计(尤其是互联网产品开发与设计)感兴趣的 Mac 新用户,如何在 Mac OS X 系统上配置开发与上网环境,另有<全新 Mac 安装指南(通用篇)>作 ...

  8. PMO是什么?如何与其他部门协作配合提高项目成功率?

    许多公司里,有许多IT项目,特别是在软件公司里,许多开发团队并没有运用灵敏开发来进行项目办理.在某些状况下,尤其在一些公司里IT不是很受注重的,只能作为一个事务支撑部分,灵敏团队面对的首要疑问,是缺少 ...

  9. css+div常用属性备忘录

    学习软件设计有一年多了,明年五月就要毕业了.回头看看发现自己其实挺差劲的. 最近开通了博客所以就整理了一下笔记,在这里发布一下自己以前学习css时总是记不住去翻书又很常用的属性,都是一些很基础的. 大 ...

  10. Chrome开发者工具不完全指南(二、进阶篇)

    上篇向大家介绍完了基础功能篇,这次分享的是Chrome开发工具中最有用的面板Sources.  Sources面板几乎是我最常用到的Chrome功能面板,也是在我看来决解一般问题的主要功能面板.通常只 ...