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

时间:2012-03-20 09:27:43

标签: sql-server sql-server-2008 tsql sql-server-2005

我想了解更多关于数据库引擎所需的不同类型的锁。

  1. 什么是
    • 行锁
    • 页面锁定
    • 桌锁
  2. 实际上是什么页面?我知道“row”代表一条记录,“table”代表一个表中的所有记录。但关于桌子的页面是什么?
  3. 数据库引擎获取这些锁(方案)?
  4. 请帮助我理解这些概念。

1 个答案:

答案 0 :(得分:39)

行锁

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

页面锁定

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

Hobt Lock

当一个表被分区为“SQL Server Table partitioning”时,可能会锁定一个单独的分区(Hobt代表堆或B树)

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

表格锁定

表锁将锁定整个表。

什么是数据页

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

数据页面只能包含一个表格中的信息,页面布局为well documented on MSDN

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

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

何时获得这些锁

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

SQL Server也遵循“锁定升级”系统,当获取超过5000个特定类型的锁时,该系统将减少锁定的粒度。有关详细信息,请参阅this article on lock escalation

此行为可以使用锁定提示进行调整,同时强调提示,在您可以为每个表指定的查询中,您希望使用哪种锁。 SQL Server将尝试遵守您的请求,但它仍将应用锁升级。