假设一个SQLCmd会话正在使用事务隔离级别REPEATABLE READ。
在这个会话中,我开始一个事务并在非索引列上执行一个UPDATE带有WHERE子句的语句。该语句应该WHERE为表中的每条记录评估子句,但只有一条会匹配。
如果我在运行UPDATE语句后检查放置在此事务下的锁,我只能看到IXTable 和 Page 上的两个锁,以及X更新的行上的锁。
我的问题是:数据库引擎不应该在它读取的所有行上放置共享锁以确保REPEATABLE READ吗?如果某个其他事务更新了一条记录,使其与 UPDATE 语句中的 WHERE 子句匹配,从而违反了REPEATABLE READ.
如果我执行 a SELECT *,那么我可以看到它S在每一行上放置了锁,这些锁尚未用X.
任何人都可以帮助我了解这种情况吗?
我已经尝试过 SQL Server 2008 R2 和 2012,两者的行为相同。