Microsoft SQL Server 数据库引擎具有多粒度锁定,允许一个事务锁定不同类型的资源。 为了尽量减少锁定的开销,数据库引擎自动将资源锁定在适合任务的级别。 锁定在较小的粒度(例如行)可以提高并发度,但开销较高,因为如果锁定了许多行,则需要持有更多的锁。 锁定在较大的粒度(例如表)会降低了并发度,因为锁定整个表限制了其他事务对表中任意部分的访问。 但其开销较低,因为需要维护的锁较少。
数据库引擎通常必须获取多粒度级别上的锁才能完整地保护资源。 这组多粒度级别上的锁称为锁层次结构。 例如,为了完整地保护对索引的读取,数据库引擎实例可能必须获取行上的共享锁以及页和表上的意向共享锁。
下表列出了数据库引擎可以锁定的资源。
资源 | 说明 |
RID | 用于锁定堆中的单个行的行标识符。 |
KEY | 索引中用于保护可序列化事务中的键范围的行锁。 |
PAGE | 数据库中的 8 KB 页,例如数据页或索引页。 |
EXTENT | 一组连续的八页,例如数据页或索引页。 |
HoBT | 堆或 B 树。 |
TABLE | 包括所有数据和索引的整个表。 |
FILE | 数据库文件。 |
APPLICATION | 应用程序专用的资源。 |
METADATA | 元数据锁。 |
ALLOCATION_UNIT | 分配单元。 |
DATABASE | 整个数据库。 |
锁的粒度与并发性关系
锁(1)—— 锁粒度和层次结构
时间: 2024-11-05 19:03:04