在读取提交的快照隔离(RCSI)下获取的共享锁


9

我看到LCK_M_S使用RCSI时正在等待共享锁()。我的理解是,这不应该发生,因为SELECTs使用RCSI时不需要共享锁。

我怎么能看到共享锁?是因为外键吗?


我还可以问一下,即使没有打开read_committed_snapshot,sql server是否也会在记录上放置共享锁?
grassbl8d 2013年

Answers:


13

我怎么能看到共享锁?是因为外键吗?

是。当出于验证外键约束的目的而访问表时,SQL Server恢复为已读提交隔离级别的锁定实现。这是正确性必需的,不能禁用。

该行为仅适用于数据修改语句。仅当检查与外键有关的数据时才使用共享锁。同一执行计划中的其他数据访问可以继续使用行版本控制。

如果SQL Server不这样做,则RCSI由于完整性检查使用的是过期(版本化)数据,因此下的数据修改语句可能最终违反外键约束。

不幸的是,当前尚无支持的方法来查看执行计划中锁定行为的这种变化。当跟踪标志8607处于活动状态时,可能会看到内部锁定提示。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.