在 ALLOW_SNAPSHOT_ISOLATION 为 OFF 时将 RE​​AD_COMMITTED_SNAPSHOT 设置为 ON

Tom*_*rek 5 sql-server transaction isolation-level snapshot-isolation

我尝试了 SQL Server 数据库的各种配置,最终设置READ_COMMITTED_SNAPSHOTONwhile ALLOW_SNAPSHOT_ISOLATIONis OFF

我注意到启用此功能后,许多查询的速度要快得多。我仍然使用默认READ COMMITTED隔离级别连接到数据库。

这里究竟发生了什么?我认为 when ALLOW_SNAPSHOT_ISOLATIONis OFF,设置READ_COMMITTED_SNAPSHOTON不会有任何影响......我实际上仍然没有使用快照隔离,还是我?有人可以解释一下吗?我糊涂了。

我尝试在网上研究这个主题,但是每当我看到READ_COMMITTED_SNAPSHOT有人使用它时,它总是与 一起使用ALLOW_SNAPSHOT_ISOLATION,而我没有启用它。

小智 5

我注意到启用此功能后,许多查询变得更快。我仍然使用默认的READ COMMITTED隔离级别来连接到数据库。

注意到这一点:

这些选项是独立的,不需要同时打开,尽管许多人错误地这样做了。打开其中任何一个都会产生行版本控制开销。READ_COMMITTED_SNAPSHOT ON导致所有READ_COMMITTED会话使用行版本控制而不是锁定,这样可以避免阻塞,并可以解释您感知到的性能改进。

此外,READ_COMMITTED_SNAPSHOT(以下称为 RCSI)只会为您提供乐观并发的一些属性。RCSI 和快照 (SI) 在三个主要方面有所不同:

  1. 所有 RC 隔离查询将立即使用 RCSI。
  2. RCSI 提供单个语句的数据库时间点(快照)视图。
  3. SI 提供整个交易的时间点视图。
  4. SI 可能存在写冲突。

这里到底发生了什么?

RCSI 已打开,因此所有 RC 隔离查询都将提升为 RCSI,其中读取器不会阻止写入器,写入器也不会阻止读取器。您看到的“加速”很可能是由于这些查询的阻塞等待减少,因为它现在使用乐观并发的版本存储而不是阻塞和等待。这可能会或可能不会为您的查询提供所需的结果。

我认为当ALLOW_SNAPSHOT_ISOLATIONis时OFF,设置READ_COMMITTED_SNAPSHOTON不会有任何效果...我实际上仍然没有使用快照隔离,或者是吗?

往上看。当 RCSI 打开时(实际上是您打开的),您正在使用它,但打开时不会自动使用 SI:您需要显式SET TRANSACTION ISOLATION LEVEL SNAPSHOT(或等效)才能使用 SI。


有关详细信息,请参阅产品文档中的SQL Server 数据库引擎中基于行版本控制的隔离级别。

与使用 RCSI/SI 时的一些陷阱和警告相关的其他有用详细信息可以在以下文章中找到: