gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:26:38 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com