共享读锁什么时候释放?

问题描述 投票:0回答:3

当 SQL Server Books online 说 “读操作完成后,资源上的共享 (S) 锁就会被释放 ,除非事务隔离级别设置为可重复读或更高,或者使用锁定提示来保留共享 (S) 锁在交易期间。” 假设我们讨论的是行级锁,没有显式事务,默认隔离级别(已提交读),“

读操作”指的是什么?

单行数据的读取?
  • 单个8k IO Page的读取?
  • 或者直到创建锁的完整 Select 语句执行完毕,无论还有多少其他行 参与?
  • 注意:我需要知道这一点的原因是我们有一个由数据层 Web 服务生成的几秒只读 select 语句,该语句创建页面级共享读锁,由于与行级独占更新冲突而产生死锁来自保持服务器更新的复制过程的锁。 select 语句相当大,有许多子选择,一位 DBA 建议我们重写它,将其分解为多个较小的语句(较短的运行片段),“以减少锁定的持有时间”。因为这假设共享读锁一直保持到完整的 select 语句完成为止,如果这是错误的(如果在读取行或页面时释放锁),那么该方法将没有任何效果......

sql-server locking isolation-level
3个回答
4
投票

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


1
投票

SELECT * FROM sys.dm_tran_locks WHERE request_session_id = <SPID>

所以,我认为正在发生的是:

获取:数据库共享锁、表共享锁、页共享锁
  1. 页面已读取...同时释放页面上的锁定并获取下一页上的锁定
  2. 两个的结果是有时在sys.dm_tran_lock查询中。我看到两个页面锁定,有时是一个,有时是三个……取决于同时操作期间发生的速度更快。


0
投票

如果 READ_COMMITTED_SNAPSHOT 设置为 OFF(SQL Server 上的默认值), 数据库引擎使用共享锁来阻止其他事务 在当前事务运行读取时修改行 手术。共享锁还阻止语句读取行 被其他事务修改,直到其他事务被修改 完全的。
共享锁的类型决定了何时释放。 在处理下一行之前释放行锁。页面锁定 当读取下一页时被释放,表锁被释放 当陈述结束时。

来源:
https://learn.microsoft.com/en-us/sql/t-sql/statements/set-transaction-isolation-level-transact-sql?view=sql-server-2017

© www.soinside.com 2019 - 2024. All rights reserved.