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