当 SQL Server 在线图书这样说时 “读取操作完成后,资源上的共享 (S) 锁就会释放,除非事务隔离级别设置为可重复读取或更高,或者有锁定提示用于在事务期间保留共享 (S) 锁。”
假设我们讨论的是行级锁,没有显式事务,默认隔离级别(已提交读),“读操作”指的是什么到?
- 读取单行数据?
- 单个 8k IO 页的读取?
- 或者直到创建锁的完整 Select 语句完成执行,无论还有多少其他行 涉及?
注意:我需要知道这一点的原因是我们有一个由数据层 Web 服务生成的几秒只读 select 语句,该语句创建页面级共享读锁,由于与行级冲突而产生死锁来自复制过程的独占更新锁,使服务器保持更新。 select 语句相当大,有许多子选择,一位 DBA 建议我们重写它,将其分解为多个较小的语句(较短的运行片段),“以减少锁定的持有时间”。因为这假设共享读锁一直保持到完整的 select 语句完成为止,如果这是错误的(如果在读取行或页面时释放锁),那么该方法将没有任何效果......
最佳答案
实际上观看起来非常有趣,您可能想启动探查器并跟踪一些简单查询的锁获取/释放。我不久前这样做过,它是这样的: 获取第 1 页 获取第 1 行 获取第 2 行 释放第 1 行 获取第 3 行 释放第 2 行 获取第 2 页 发布第1页 ...
我可能不是100%正确,但这基本上就是方法。因此,在读取行后释放锁,或者更正确地说,在获取下一行锁后释放锁。我怀疑这可能与保持遍历状态一致有关。
关于sql-server - 共享读锁什么时候释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/941928/