首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >何时释放共享读锁?

何时释放共享读锁?
EN

Stack Overflow用户
提问于 2009-06-02 21:07:33
回答 3查看 4.2K关注 0票数 11

当Server联机丛书指出,“资源上的共享(S)锁在读取操作完成后立即释放时,除非事务隔离级别设置为可重复读取或更高级别,或者使用锁定提示在事务期间保留共享(S)锁”。

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

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

注意:我需要知道这一点的原因是我们有一个由数据层web服务生成的第二个只读的select语句,它创建页面级的共享读锁,由于与保持服务器更新的复制过程中的行级独占更新锁冲突而产生死锁。select语句相当大,有许多子选择,一个DBA建议我们重写它,将它分解成多个较小的语句(较短的运行段),“以减少锁的持有时间”。由于这假设共享读锁一直保持到完整select语句完成为止,如果这是错误的(如果在行或页读取时释放锁),则该方法将没有任何效果.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-06-02 21:15:27

实际上,非常有趣的是,您可能希望激活分析器并跟踪一些简单查询的锁获取/发布。我很久以前就这样做了,就像:获取页面1,获取第1行,获取第2行,发布第1行,获得第3行,发布第2行,获得第2页发布页1.

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

票数 4
EN

Stack Overflow用户

发布于 2012-01-13 07:47:13

我不相信它同时获得了两个页面级别的锁。我认为它只出现在分析器中,因为事件发生得太快了。如果像您所怀疑的那样发生这种情况,那么总是会有两个页面级别的锁,但是当使用共享锁运行大型查询时,我有时会看到两个页面级别的锁,有时通过这个查询看到一个:

代码语言:javascript
运行
复制
SELECT *
FROM sys.dm_tran_locks
WHERE request_session_id = <SPID>

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

  1. 获取: db共享锁、表共享锁、页共享锁
  2. 页被读取。同时释放页面上的锁并获取下一页的锁定

两者的结果是,有时在sys.dm_tran_lock查询中。我看到两个页面锁,有时是一个和几个三次..。取决于在同步操作过程中发生的更快的事情。

票数 1
EN

Stack Overflow用户

发布于 2019-01-07 17:09:58

关于具体文件,我发现:

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/941928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档