动手分析SQL Server中的事务中使用的锁( 四 )


OBJECT
GRANT
IX
 
UserTable
NULL
NULL
52
KEY
GRANT
X
(ff4928fe375a)
UserTable
4
idx_UserTable_LastModifyTime
52
KEY
GRANT
X
(0ee48b5e6942)
UserTable
1
PK__Test1__3213E83F133024F3
52
KEY
GRANT
X
(150ba0b85c41)
UserTable
4
idx_UserTable_LastModifyTime
从上表中可以看出在更新数据的时候,由于涉及到多行的非聚集索引上面的数据,因此对于该索引涉及到的数据行都增加了X锁,涉及到的数据页也比之前更多了 。类型为X锁,同时索引名称为PK__Test1__3213E83F133024F3的有两行,因为本次事务匹配到了两行数据;类型为X锁,同时索引名称为idx_UserTable_LastModifyTime的一共有四行 。为什么是四行呢?因为有两个旧的数据需要删除,同时新增了两个新的数据,所以是四行 。其他的非聚集索引的数据并没有修改,所以本次不需要申请X锁 。
总结数据库中的各种事务隔离级别都是通过对于不同锁的综合运用实现的 。对于锁的认识可以从两个角度进行:锁模式和锁对象 。哪怕是一个简单的select语句都会有默认的某种锁以保护数据的正确性 。需要注意不同的数据组合情况、不同的事务隔离级别下SQL语句的执行过程可能是不一样的,因此其使用的锁也会千变万化,本文所列举的只是一些很简单的情况,但是规则类似,分析路径也是基本一致的,有兴趣的可以自己尝试下日常工作中语句的执行过程中使用的锁,这对于理解数据库工作原理,有针对性的对于SQL语句调优都有一定帮助(注意不要在生产环境执行这类分析) 。
参考文档

  1. SQL Server, Locks object
  2. 事务锁定和行版本控制指南
  3. Microsoft SQL Server企业级平台管理实践




推荐阅读