你的位置:首页 > 软件开发 > 数据库 > SQL Server里的闩锁介绍

SQL Server里的闩锁介绍

发布时间:2015-07-25 11:00:09
在今天的文章里我想谈下SQL Server使用的更高级的,轻量级的同步对象:闩锁(Latch)。闩锁是SQL Server存储引擎使用轻量级同步对象,用来保护多线程访问内存内结构。文章的第1部分我会介绍SQL Server里为什么需要闩锁,在第2部分我会给你介绍各个闩锁类型,还有 ...

SQL Server里的闩锁介绍

在今天的文章里我想谈下SQL Server使用的更高级的,轻量级的同步对象:闩锁(Latch)。闩锁是SQL Server存储引擎使用轻量级同步对象,用来保护多线程访问内存内结构。文章的第1部分我会介绍SQL Server里为什么需要闩锁,在第2部分我会给你介绍各个闩锁类型,还有你如何能对它们进行故障排除。

为什么我们需要闩锁?

闩锁首次在SQL Server 7.0里引入,同时微软首次引入了行级别锁(row-level locking)。对于行级别锁引入闩锁的概念是非常重要的,不然的话在内存中会出现丢失更新(Lost Updates)的现象。如我所说的,闩锁是存储引擎使用的轻量级同步对象,是SQL Server用来保护内存结构的。闩锁只不过是类似于多线程编程里的所谓的临界区(Critcal Section)概念。

在传统并发编程里,临界区是同时只能一个线程运行的代码。闩锁本身是个临界区的特殊版本,因为它允许多个并发读操作。在SQL Server的上下文里这意味着多个线程可以并发读取一个共享数据结构,例如内存中的页,但是写入共享数据结构必须是单个线程进行。

闩锁是用来协调数据库里多个线程物理执行,然而锁是基于选择的事务隔离级别,用来逻辑获得需要的隔离级别。作为开发者或DBA的你,你可以用不同方式影响锁——例如通过SQL Server里的隔离级别,或者通过各种可用锁提示。另一方面闩锁是不能以直接方式控制的。在SQL Server里没有闩锁提示,也没有可用闩锁隔离级别。下表是锁和闩锁之间的比较:

                 锁(Locks)         闩锁(Latches)

  • 控制……      事务              线程
  • 保护……    数据库内容          内存中数据结构
  • 模式……     共享的(Shared),      保持(Keep),

                 更新(Update),         共享的(Shared),

                 排它的(Exclusive),     更新(Update),排它的(Exclusive),

                 意向的(Intension)      销毁(Destroy)

  • 死锁…… 检测并解决(detection&resolution)  通过严谨代码来避免
  • 保持在……  锁管理器的哈希表(Hashtable)   保护的数据结构(Protected Data Structure)

从表里可以看到,闩锁支持更细粒度保持(Keep)和销毁(Destroy)模式。保持闩锁主要用来引用计数,例如当你想知道在指定闩锁上有多少其它闩锁在等待。销毁闩锁是最有限制的一个(它甚至会阻塞保持闩锁),当闩锁被销毁时会用到,例如当惰性写入器(Lazy Writer)想要释放内存中的页时。我们先介绍下各种闩锁模式,然后说下各个闩锁模式的兼容性。

NL(空闩锁):

  • 内部
  • 未使用

KP(保持闩锁):

  • 可以由多个任务同时持有
  • 只被一个DT模式的闩锁阻塞

SH(共享闩锁):

  • 读取数据页的时候使用
  • 可以由多个任务同事持有
  • 阻塞EX模式和DT模式的闩锁

UP(更新闩锁):

  • 写入系统分配页面和tempdb的行版本化页面时使用
  • 一个这种模式的闩锁只能被一个单独的任务持有

EX(排它闩锁):

  • 写入数据页的时候使用
  • 一个这种模式的闩锁只能被一个单独的任务持有

DT(销毁闩锁):

原标题:SQL Server里的闩锁介绍

关键词:sql

sql
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。