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