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
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。