当SQL Server Books online说“在读操作完成后,对资源的共享(S)锁将被释放”,除非事务隔离级别设置为可重复读或更高,或者使用锁提示来保留共享(S)锁直到事务结束。
假设我们讨论的是行级锁,在默认隔离级别(读取提交)下,"读操作"指的是什么?
- 单个数据行的读取? - 单个8k IO页的读取? - 或者直到创建锁的完整Select语句执行完成,无论涉及多少其他行?
注意:我需要知道这个原因是因为我们有一个由数据层Web服务生成的几秒钟只读选择语句,它创建了页面级共享读锁,由于与保持服务器更新的复制过程中的行级独占更新锁冲突而导致死锁。选择语句相当大,包含许多子选择,并且有一个数据库管理员建议我们将其重写为多个较小的语句(运行时间较短的片段),以“减少锁定的持续时间”。如果假设共享读锁在完成整个选择语句之前一直保持,那么如果这种假设是错误的(如果在读取行或页面时释放锁),那么这种方法将毫无效果...
假设我们讨论的是行级锁,在默认隔离级别(读取提交)下,"读操作"指的是什么?
- 单个数据行的读取? - 单个8k IO页的读取? - 或者直到创建锁的完整Select语句执行完成,无论涉及多少其他行?
注意:我需要知道这个原因是因为我们有一个由数据层Web服务生成的几秒钟只读选择语句,它创建了页面级共享读锁,由于与保持服务器更新的复制过程中的行级独占更新锁冲突而导致死锁。选择语句相当大,包含许多子选择,并且有一个数据库管理员建议我们将其重写为多个较小的语句(运行时间较短的片段),以“减少锁定的持续时间”。如果假设共享读锁在完成整个选择语句之前一直保持,那么如果这种假设是错误的(如果在读取行或页面时释放锁),那么这种方法将毫无效果...