在SQL Server里咱们为何须要意向锁(Intent Locks)?

在1年前,我写了篇在SQL Server里为何咱们须要更新锁。今天我想继续这个讨论,谈下SQL Server里的意向锁,还有为何须要它们。html

SQL Server里的锁层级

当我讨论SQL Server里的锁升级时,我从SQL Server使用的锁层级开始题,在你读或修改你的数据的时候。sql

当你读取一条记录时,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)。这只是个标识,没别的。spa

但这个标识怎么帮助SQL Server性能优化?假设你再表层级请求一个排它锁(X)。在这个状况下,SQL Server须要知道在某个记录上是否有不兼容的锁(像共享锁(S)或更新锁(U))。没有意向锁,SQL Server须要检查每条记录来看是否有一个授予的不兼容锁。server

但在表层级有意向共享锁(IS)的话,SQL Server立刻知道在某个地方有授予的共享锁(S),所以在表层级不能请求排它锁(X)。这个就是SQL Server里存在乎向锁的缘由:在锁层级里,若是某个地方有不兼容的锁存在,可让SQL Server快速查到。很简单,是否是?htm

小结

技术上,SQL Server不须要意向锁,由于它只表示在锁层级里,某个地方有一些其余特定类型的锁。当基于若是你想在页或表上请求特定的锁,SQL Server能够更高效的检查是否有不兼容的锁存在,仍是须要有意向锁。blog

感谢关注!get

原文连接:

https://www.sqlpassion.at/archive/2016/05/16/why-do-we-need-intent-locks-in-sql-server/

相关文章
相关标签/搜索