sql-server - 共享读锁什么时候释放?

标签 sql-server locking isolation-level

当 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/

相关文章:

sql-server - Sql Server 2008替代数据库的建议

c# - COM 和线程安全

mysql - 插入唯一文本需要什么最低隔离级别?

mysql - mysql中如何实现多次NULL检查事务

java - 为什么 CLASSPATH 对于 Python 失败但对于 RazorSQL 却有效?

sql - 自动匹配 INSERT INTO ... SELECT ... FROM 中的列

sql - 无法运行 alter database 命令

locking - 对 DBMS 锁定的说明

javascript - 当页面已打开时锁定页面

python - 如何在 SQLAlchemy for PostgreSQL 中设置事务隔离级别?