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

gra*_*l8d 9 sql-server-2008 sql-server locking snapshot-isolation

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

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

Pau*_*ite 14

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

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

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

如果 SQL Server 没有这样做,则下面的数据修改语句RCSI最终可能会违反外键约束,因为完整性检查使用了过时(版本化)数据。

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