什么是行锁,页锁和表锁?当他们被收购?

Par*_*ram 25 t-sql sql-server sql-server-2005 sql-server-2008

我想更多地了解数据库引擎所需的不同类型的锁.

  1. 是什么
    • 行锁
    • 页面锁定
    • 表锁
  2. 实际上页面是什么?我知道"row"代表一条记录,"table"代表一个表中的所有记录.但是关于桌子的页面是什么?
  3. 当数据库引擎获取这些锁(方案)时?

请帮我理解这些概念.

Fil*_*Vos 42

行锁

行锁是SQL Server中可能的最低锁定粒度级别.这意味着将锁定一个或多个特定行,并且相邻行仍可用于通过并发查询进行锁定.

页面锁定

即使您的查询只需要页面中的10个字节,SQL Server中的页锁也将锁定8K的数据.因此,您的查询将锁定您在查询中未请求的其他数据.

Hobt Lock

当使用" SQL Server表分区 "对表进行分区时,可能会锁定单个分区(Hobt代表堆或B树)

注意:默认情况下禁用锁定升级到HOBT锁定.运行ALTER TABLE MyTable SET (LOCK_ESCALATION = AUTO)以启用HOBT锁升级.

表锁

表锁将锁定整个表.

什么是数据页面

Microsoft SQL Server在"数据页"中组织所有数据,可以容纳8K的数据.这意味着对于SQL Server 8K中的任何数据访问都将读取信息.

数据页只能包含来自一个表的信息,并且MSDN上已经详细记录了页面的布局

SQL Server将始终读取完整数据页的事实也让您了解为什么它更喜欢使用页级锁.页面级别锁定的含义是您可能会锁定比您想象的更多的数据.

例如,假设我们有一个总记录大小为1024字节的表,并在该字段上具有聚簇索引ID.当我们运行以下查询时:SELECT * from MyTable (xlock) where ID = 123不仅该记录将被锁定,而且(取决于页面填充)最多还会锁定3个附加记录.

什么时候获得这些锁

查询将由查询调控器解析,并且将从锁管理器确定并请求所需的锁.SQL Server将尝试在性能和争用之间取得平衡,以确定锁定策略.

SQL Server还遵循"锁定升级"系统,当获取超过5000个特定类型的锁时,该系统将减少锁定的粒度.有关更多信息,请参阅有关锁定升级的文章.

这种行为可以使用进行调整锁定提示与应激提示,在查询中,你可以为每个表什么样的锁,你宁愿指定.SQL Server将尝试遵守您的请求,但它仍将应用锁升级.