什么是 SQL Server 中的意图锁

msl*_*lot 4 sql-server locking serialization

我有这个查询

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN

UPDATE c
SET c.Score = 2147483647 
FROM dbo.Comments AS c
WHERE c.Id BETWEEN 1 AND 5000;
Run Code Online (Sandbox Code Playgroud)

哪个有这些统计数据

+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X     | Comments      | KEY           |        2429 |
| IX           | Comments      | OBJECT        |           1 |
| IX           | Comments      | PAGE          |          97 |
+--------------+---------------+---------------+-------------+
Run Code Online (Sandbox Code Playgroud)

我想知道 IX,它是一个意图锁。这是什么意思,为什么桌子上有一个它自己?据我了解,它不是真正的锁,而是 SQL Server 使用(或由事务设置?)来指示可能发生锁的更多东西。

以上是对的吗?

Wor*_*DBA 6

您是对的,这是向引擎发出的信号,表明您希望锁定对象。为了过于简单,假设您想从图书馆获取一本书,如果有人借出这本书,您将无法获取,因此您将自己的名字列在打算借出该书的人的名单上。当其他人都完成了它,轮到你时,你就可以去看看这本书了。

如果您还没有这样做,我强烈建议您阅读MSDN 上的事务锁定和行版本控制指南,其中提供了有关其工作原理的一些详细信息。

以下是该页面的片段:

意图锁

SQL Server 数据库引擎使用意向锁来保护在锁层次结构中较低的资源上放置共享 (S) 锁或排它 (X) 锁。意向锁之所以被称为意向锁,是因为它们是在较低级别的锁之前获取的,因此表示意图将锁放置在较低级别。意图锁有两个目的:

  • 防止其他事务以会使较低级别的锁无效的方式修改较高级别的资源。

  • 提高 SQL Server 数据库引擎在更高粒度级别检测锁冲突的效率。

例如,在该表中的页或行上请求共享 (S) 锁之前,在表级别请求共享意向锁。在表级别设置意向锁可防止另一个事务随后在包含该页的表上获取排他 (X) 锁。意向锁提高了性能,因为 SQL Server 数据库引擎仅在表级别检查意向锁以确定事务是否可以安全地获取该表上的锁。这消除了检查表上的每一行或页锁以确定事务是否可以锁定整个表的要求。