当 SQL Server 联机丛书说“读取操作完成后立即释放资源上的共享 (S) 锁,除非事务隔离级别设置为可重复读取或更高,或者使用锁定提示来保留共享 ( S) 在事务期间锁定。”
假设我们谈论的是行级锁,没有显式事务,在默认隔离级别(读取已提交),“读取操作”指的是什么?
- 单行数据的读取?
- 单个 8k IO 页面的读取?
- 或者直到创建锁的完整 Select 语句完成执行,无论涉及多少其他行?
注意:我需要知道这一点的原因是我们有一个由数据层 Web 服务生成的几秒钟的只读选择语句,它创建页面级共享读锁,由于与行级独占更新锁冲突而产生死锁来自保持服务器更新的复制过程。select 语句相当大,有许多子选择,一位 DBA 建议我们重写它以将其分解为多个较小的语句(运行时间较短的部分),“以减少持有锁的时间”。因为这假设共享读取锁一直保持到完整的选择语句完成,如果这是错误的(如果在读取行或页面时释放锁),那么该方法将没有任何效果......