SQL Server行/页/表锁定,它们何时发生?

时间:2011-10-31 10:29:31

标签: sql sql-server-2008 locking

我想知道是否有人可以在SQL Server(2008)中解释一下有关锁定和锁定升级的问题,或者指出我有关它的好文章。

我想更好地了解何时可能发生(行/页/表)锁定或SQL Server决定升级锁定的场景。

例如,如果正在删除许多行,或者只有在使用显式事务时才会发生锁定,那么没有指定事务的delete语句会导致表锁定吗?

我知道这可能是个大问题,但任何意见都值得赞赏。

德克

1 个答案:

答案 0 :(得分:2)

您的问题:SQL Server行/页/表锁定,它们何时发生?

回复:您指的是Lock Escalation。锁定升级(行/页/表)发生 (1)在单个非分区表或索引上获取至少5000个锁时 (2)当单个tsql语句在分区表的单个分区上获取至少5000个锁时 (3)当实例中的锁数超过内存或配置阈值时。 (4)当锁冲突阻止升级时,sql server会为每1,250个新锁锁触发锁升级。;

如果语句在一个索引中获取3,000个锁,在同一个表的另一个索引中获取3,000个锁,则不会触发锁定升级。同样,如果语句在表上具有自联接,则不会触发锁定升级,并且对表的每个引用仅在表中获取3,000个锁。

锁定升级仅适用于触发升级时访问过的表格。

每当锁的数量大于锁升级的内存阈值时,数据库引擎就会触发锁升级。内存阈值取决于锁配置选项的设置:

如果locks选项设置为其默认设置0,则当锁定对象使用的内存占数据库引擎使用的内存的24%(​​不包括AWE内存)时,将达到锁定升级阈值。用于表示锁的数据结构大约为100个字节。此阈值是动态的,因为数据库引擎动态获取并释放内存以根据不同的工作负载进行调整。

如果locks选项的值不是0,那么锁定升级阈值为locks选项值的40%(如果存在内存压力则更低)。

以下内容将返回数据库实例的锁定信息

SELECT resource_type,resource_associated_entity_id,     request_status,request_mode,request_session_id,     resource_description     FROM sys.dm_tran_locks     WHERE resource_database_id =