SQLServer 查询和更新是否阻塞,解惑篇

本文通过实验分析了SQLServer的ReadCommitted和RepeatableRead两种隔离级别对读写操作的影响。在ReadCommitted级别下,读操作完成后立即释放SharedLock,允许更新;而在RepeatableRead级别,共享锁会保持到事务结束,可能导致页锁升级为表锁,从而引发阻塞。实验揭示了SQLServer锁管理的内在机制。
摘要由CSDN通过智能技术生成

SQLServer 默认隔离级别:Read Committed
先看执行结果:

试验1:

图1: 查询Production表(几千万条数据)
在这里插入图片描述图2: 在图1执行的时候更新无阻塞
在这里插入图片描述

试验2:

SQLServer 修改Session Level隔离级别: REPEATABLE Read
图3: 查询产量表(千万级)

在这里插入图片描述图4: 在图3查询产量的时候更新产量表阻塞
在这里插入图片描述
结论如下:

在 Read Committed(不使用row-versioning) 隔离级别下,在读操作执行时,申请和持有Share Lock;一旦读操作完成,释放Shared Lock;
在 Repeatable Read 和 Serializable隔离级别下,事务会持有Shared Lock,直到事务结束(提交或回滚);

这里本人有个疑问:产量表千万级查询的时候共享锁,为何还能更新呢?

我们应当学会透过现象看本质 试验3:看下 试验1 查询产量表的时候数据库如何增加锁的?

图5: 先获取seession_id
在这里插入图片描述

然后让图5的语句再执行一遍。

图6:在上面的SQL执行过程钟执行如下查看加锁语句,可以看到Page页锁

在这里插入图片描述

图7:再执行一次,可以看到Page页锁发生变化了。

在这里插入图片描述

试验4:看下 试验2 查询产量表的时候数据库如何增加锁的?

图8:Repeatable Read隔离级别,先查询Session_ID

在这里插入图片描述

图9: 在上面的SQL执行过程钟执行如下查看加锁语句,可以看到2164个页锁

在这里插入图片描述

图10:过几秒钟,再执行一次,可以看到41个表锁,(看来页锁过多的时候SQLServer会自动上升升级为表锁)

在这里插入图片描述

由此可以看出,默认隔离级别:查询与更新无阻塞,Page页锁申请和持有,一旦读取完毕,会立即释放,不会一直持有。 Repeatable隔离级别:查询与更新阻塞,Page页锁申请和持有,直到整个事务执行完毕,才会释放页锁,由此页锁一直持有升级为表锁。
欢迎大佬们指点纠正。(谢谢大佬指正,本人已修正)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值