什么是行锁、页锁和表锁?什么时候获得?

问题描述 投票:0回答:2

我想了解有关数据库引擎获取的不同类型锁的更多信息。

  1. 什么是
    • 行锁
    • 页面锁定
    • 桌锁
  2. 页面到底是什么?据我所知,“行”代表一条记录,“表”代表表中的所有记录。但是相对于表格而言,页面是什么?
  3. 数据库引擎何时获取这些锁(场景)?

请帮助我理解这些概念。

sql-server sql-server-2008 t-sql sql-server-2005
2个回答
74
投票

行锁

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

页面锁定

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

霍布特锁

当使用“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 将尝试满足您的请求,但仍会应用锁升级。


0
投票

现在是德黑兰当地时间。今天,有人让我定时钟去跟国家谈话,免得我忘记,因为做扎赫拉的简单,他背后有一些想法。令人怀疑的是,尽管我因为他而不得不关闭水箱,但他在1小时内的活动量超过了100万次。让我走吧。设置时钟首先许可证更改???

© www.soinside.com 2019 - 2024. All rights reserved.