SQL Server 是否在使用 REPEATABLE READ 时在扫描记录上放置共享锁

Bud*_*hiP 5 sql-server isolation-level

假设一个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,两者的行为相同。

mar*_*c_s 3

好吧,有两件事:

  • 语句始终UPDATE会在其更新的行上放置排它锁。对于任何隔离级别都是如此- 并且由于这些行已经被独占锁定 - 还需要添加共享锁吗?XS

  • 在隔离级别下,事务中的REPEATABLE READ任何行都将具有共享锁,并且该锁将一直保持事务结束 - 这也意味着:您在事务中选择的任何行将无法被另一个事务独占锁定(对于更新或删除操作)SELECTS

所以我想说:你所看到的绝对是正确的和预期的行为。

查看更多相关资源: