我想了解更多关于不同类型的锁数据库引擎的需求。
请帮助我理解这些概念。
发布于 2012-03-20 10:48:16
排船闸
行锁是Server中可能存在的最低级别的锁定粒度。这意味着一个或多个特定的行将被锁定,而相邻的行仍然可以通过并发查询进行锁定。
页面锁定
即使您的查询只需要来自页面的10个字节,Server中的页锁也会锁定8K值的数据。因此,查询将锁定查询中不请求的其他数据。
霍伯特锁
当使用"Server表分区“对表进行分区时,可能会锁定单个分区(Hobt表示堆或B树)。
注意:默认情况下,锁升级为HOBT锁是禁用的。运行ALTER TABLE MyTable SET (LOCK_ESCALATION = AUTO)以启用HOBT锁升级。
表锁
表锁将锁定完整的表。
什么是数据页
将其所有数据组织在“数据页”中,可容纳8K值的数据。这意味着,对于Server 8K中的任何数据访问,都将读取信息。
数据页只能包含来自一个表的信息,并且页面的布局是详细记录在MSDN上。
Server将始终读取完整的数据页这一事实也使您了解为什么它更喜欢使用页面级别的锁。页面级别锁的含义是,您可能会锁定比您想象的更多的数据。
例如,假设我们有一个总记录大小为1024字节的表,在字段ID上有一个聚集索引。当我们运行以下查询时:SELECT * from MyTable (xlock) where ID = 123不仅将锁定该记录,而且(取决于页面填充)还将锁定最多3条附加记录。
这些锁是什么时候获得的
查询将由查询调控器解析,所需的锁将由锁管理器确定并请求。Server将尝试在性能和争用之间取得平衡,以确定锁定策略。
Server还遵循一个“锁升级”系统,当获取超过5000个特定类型的锁时,该系统将减少锁定的粒度。有关详细信息,请参阅这篇关于锁升级的文章。
这种行为可以使用锁定提示对提示进行调整,在查询中您可以指定每个表需要什么样的锁。Server将尝试满足您的请求,但它仍将应用锁升级。
https://stackoverflow.com/questions/9784172
复制相似问题