SQL Server可以锁定的资源类型

SQL Server可以锁定的资源类型

SQL Server可以锁定不同类型的资源。这些可以被锁定的资源类型包括:RIDs或键(keys)(行级别),页(pages),对象(objects)(例如,表),数据库(databases)和其他。行位于页中,而也是包含表或索引数据的物理数据块。你首先应该熟悉这些资源类型,到更高级的阶段,你可能会要熟悉其他锁定资源类型,像盘区(extents),分配单元(allocation units),堆(heaps)或B树(B-trees)。

为了获得一个特定资源类型的锁,你的事务必需首先获得更高粒度级别上的相同模式的意向锁。例如,为了获得一个行上的排它锁,你的事务必需首先在行位于的页上申请意向排它锁和拥有页的对象上的意向排它锁。类似的,为了获得一个特定粒度级别上的共享锁,你的事务必需首先在更高粒度级别上申请一个意向共享锁。意向锁的目的是在更高的粒度级别上有效地检测到不兼容锁请求并阻止授予它们。例如,一个事务持有一个行锁,而另一个事务在行位于的整个页或表上请求一个不兼容的锁模式,因为第一个事务在页和表上获得的意向锁,对于SQL Server很容易识别冲突。意向锁不会干扰行级别粒度上的锁请求。例如,一个页上的意向锁不会阻止其它事务在该页的行上获得不兼容的锁模式。

锁兼容性表如下:

请求模式 授予了排它锁(X) 授予了共享锁(S) 授予了意向排它锁(IX) 授予了意向共享锁(IS)
是否授予排它锁请求? 否 
是否授予共享锁请求?
是否授予意向排它锁请求?
是否授予意向共享锁请求?

 
SQL Server动态决定锁定哪个资源类型。当然,对于理想的并发,最好只锁定需要锁定的资源,也就是只锁定影响的行。然而,锁定需要内存资源和内部管理开销。因此,当SQL Server选择锁定哪个资源类型时,要同时考虑并发和系统资源。

SQL Server会首先申请细粒度的(fine-grained)锁(像行或页锁),在一定情况下,尝试升级细粒度的锁到更粗粒度(coarse-grained)锁(像表锁)。例如,当一条语句获得至少5000个锁,然后对于每1250个新锁,如果之前尝试锁升级不成功,那么锁升级(lock escalation)被触发。

在SQL Server 2008和SQL Server 2012,你可以通过使用ALTER TABLE语句设置一个表选项,来控制锁升级的行为方式。如果你喜欢,也可以禁用锁升级,或者决定在表级别(默认)或者分区级别发生锁升级。(一个表可以被物理组织到多个更小的单元叫做分区。)


翻译自
Itzik Ben-Gan
Microsoft SQL Server 2012 T-SQL Fundamentals
Page 302
Lockable Resource Types










本文转自UltraSQL51CTO博客,原文链接: http://blog.51cto.com/ultrasql/1844678,如需转载请自行联系原作者





上一篇:解决mybatis在mysql中查询字段为关键字的问题


下一篇:python Pdf 添加 文字 图片 线段 曲线 矩形 椭圆 例子