什么时候发布共享读锁?

Cha*_*ana 10 sql-server locking isolation-level

当SQL Server Books联机表示" 读取操作完成后,资源上的共享(S)锁定被释放" ,除非将事务隔离级别设置为可重复读取或更高,或者使用锁定提示来保留共享( S)在交易期间锁定."

假设我们在默认隔离级别(Read Committed)上讨论的是没有显式事务的行级锁,那么" 读操作 "指的是什么?

  • 读取单行数据?
  • 读取单个8k IO页面?
  • 或者直到创建锁的完整Select语句完成执行,无论涉及多少其他行?

注意:我需要知道的原因是我们有一个由数据层Web服务生成的第二个只读select语句,它创建页级共享读锁,由于与行级独占更新锁冲突而生成死锁来自使服务器保持更新的复制程序.select语句相当大,有许多子选择,一个DBA建议我们重写它以将其分解为多个较小的语句(较短的运行部分),"减少锁定持有的时间".因为这假设共享读锁被保持直到完成select语句完成,如果这是错误的(如果在行或页面被读取时释放锁)那么该方法将不会产生任何影响....

aha*_*ins 4

实际上观看起来非常有趣,您可能想要启动探查器并跟踪一些简单查询的锁获取/释放。我不久前这样做过,它是这样的: 获取第 1 页 获取第 1 行 获取第 2 行 释放第 1 行 获取第 3 行 释放第 2 行 获取第 2 页 释放第 1 页 ...

我可能不是100%正确,但这基本上就是方法。因此,在读取行后释放锁,或者更正确地说,在获取下一行锁后释放锁。我怀疑这可能与保持遍历状态一致有关。