当Server联机丛书指出,“资源上的共享(S)锁在读取操作完成后立即释放时,除非事务隔离级别设置为可重复读取或更高级别,或者使用锁定提示在事务期间保留共享(S)锁”。
假设我们讨论的是行级锁,在默认的隔离级别(Read )上没有显式事务,那么"read操作“指的是什么?
注意:我需要知道这一点的原因是我们有一个由数据层web服务生成的第二个只读的select语句,它创建页面级的共享读锁,由于与保持服务器更新的复制过程中的行级独占更新锁冲突而产生死锁。select语句相当大,有许多子选择,一个DBA建议我们重写它,将它分解成多个较小的语句(较短的运行段),“以减少锁的持有时间”。由于这假设共享读锁一直保持到完整select语句完成为止,如果这是错误的(如果在行或页读取时释放锁),则该方法将没有任何效果.
发布于 2009-06-02 21:15:27
实际上,非常有趣的是,您可能希望激活分析器并跟踪一些简单查询的锁获取/发布。我很久以前就这样做了,就像:获取页面1,获取第1行,获取第2行,发布第1行,获得第3行,发布第2行,获得第2页发布页1.
我可能不是百分之百正确,但这基本上是方法。因此,锁是在读取行之后释放的,或者更正确地说是在获取下一行锁之后释放的。我怀疑这可能与保持一个一致的遍历状态有关。
发布于 2012-01-13 07:47:13
我不相信它同时获得了两个页面级别的锁。我认为它只出现在分析器中,因为事件发生得太快了。如果像您所怀疑的那样发生这种情况,那么总是会有两个页面级别的锁,但是当使用共享锁运行大型查询时,我有时会看到两个页面级别的锁,有时通过这个查询看到一个:
SELECT *
FROM sys.dm_tran_locks
WHERE request_session_id = <SPID>
所以,我认为正在发生的是:
两者的结果是,有时在sys.dm_tran_lock查询中。我看到两个页面锁,有时是一个和几个三次..。取决于在同步操作过程中发生的更快的事情。
发布于 2019-01-07 17:09:58
关于具体文件,我发现:
如果READ_COMMITTED_SNAPSHOT设置为OFF (Server上的默认设置),数据库引擎将使用共享锁来防止其他事务在当前事务运行读取操作时修改行。共享锁还阻止语句读取由其他事务修改的行,直到其他事务完成为止。共享锁类型决定何时释放。在处理下一行之前释放行锁。下一页读取时释放页面锁,语句结束时释放表锁。
https://stackoverflow.com/questions/941928
复制相似问题