当 SQL Server Books online 说 “读操作完成后,资源上的共享 (S) 锁就会被释放 ,除非事务隔离级别设置为可重复读或更高,或者使用锁定提示来保留共享 (S) 锁在交易期间。” 假设我们讨论的是行级锁,没有显式事务,默认隔离级别(已提交读),“
读操作”指的是什么?
单行数据的读取?
我可能不是100%正确,但这基本上就是方法。因此,在读取行后释放锁,或者更正确地说,在获取下一行锁后释放锁。我怀疑这可能与保持遍历状态一致有关。
SELECT *
FROM sys.dm_tran_locks
WHERE request_session_id = <SPID>
所以,我认为正在发生的是:
获取:数据库共享锁、表共享锁、页共享锁
如果 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来源: