共享读锁何时发布?

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

假设我们谈论的是行级锁,没有明确的事务,在默认隔离级别(Read Committed)下,“ 读取操作 ”指的是什么?

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


    实际观察非常有趣,您可能想要启动分析器并追踪一些简单查询的锁定获取/释放。 我做了一段时间后,它是这样的:获取页面1获得行1获得行2发布行1获得行3发布行2获取页2发布页1 ...

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


    我不相信它会同时获取两个页面级锁。 我认为它只能以这种方式出现在配置文件中,因为事件发生得如此之快。 如果它像你怀疑的那样发生,总会有两个页面级别的锁定,但是当运行带有共享锁定的大型查询时,我有时会看到两个页面级别的锁定,有时候会看到一个通过此查询的锁定:

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

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

  • 获取:db共享锁,表共享锁,页面共享锁
  • 页面被读取...页面上的同时释放锁定并获取下一页面上的锁定
  • 两者的结果有时是在sys.dm_tran_lock查询中。 我看到两个PAGE锁,有时一个和几个三..取决于在同时操作过程中发生的更快。

    链接地址: http://www.djcxy.com/p/42653.html

    上一篇: When are shared read locks released?

    下一篇: Deadlock on SELECT/UPDATE