我试验了Server数据库的各种配置,最终将READ_COMMITTED_SNAPSHOT设置为ON,而ALLOW_SNAPSHOT_ISOLATION是OFF。
我注意到当启用这个功能时,许多查询变得更快了。我仍然使用默认的READ COMMITTED隔离级别连接到数据库。
这里到底发生了什么?我认为当ALLOW_SNAPSHOT_ISOLATION是OFF**时,将** READ_COMMITTED_SNAPSHOT设置为ON不会有任何效果.我仍然没有实际使用快照隔离,或者我是吗?有人能解释一下吗?我很困惑。
我试着在网上研究这个话题,但是每当我看到READ_COMMITTED_SNAPSHOT被使用时,它总是和ALLOW_SNAPSHOT_ISOLATION在一起,而我没有启用它。
发布于 2018-05-08 23:36:30
我注意到当启用这个功能时,许多查询变得更快了。我仍然使用默认的
READ COMMITTED隔离级别连接到数据库。
丹注意到这一点:
这些选项是独立的,两者都不需要开启,尽管许多人错误地这样做了。打开任何一个都会引起行版本控制开销。
READ_COMMITTED_SNAPSHOT ON使所有READ_COMMITTED会话使用行版本控制而不是锁定,从而避免阻塞,并可能解释您感知到的性能改进。
此外,READ_COMMITTED_SNAPSHOT (此后称为RCSI)只会给您提供一些乐观并发的属性。RCSI和快照(SI)主要有三种不同之处:
这里到底发生了什么?
RCSI是打开的,因此所有RC隔离查询都被提升到RCSI,在RCSI中,读取器不阻塞作者,而编写器不阻塞读取器。您所看到的“加速”最有可能是由于对这些查询的等待减少了,因为它现在使用的是乐观并发的版本存储,而不是阻塞和等待。这可能是也可能不是在查询中给出所需的结果。
我认为当
ALLOW_SNAPSHOT_ISOLATION是OFF时,将READ_COMMITTED_SNAPSHOT设置为ON不会有任何效果.我仍然没有实际使用快照隔离,或者我是吗?
请参见上面的。您在打开RCSI时使用它(这实际上是打开的),但是SI在打开时不会自动使用:您需要显式地使用SET TRANSACTION ISOLATION LEVEL SNAPSHOT (或等效的)才能使用SI。
有关更多信息,请参见产品文档中的Server数据库引擎中基于行版本的隔离级别。
在使用RCSI/SI时,有关某些问题和注意事项的其他有用细节可以在以下文章中找到:
https://dba.stackexchange.com/questions/206125
复制相似问题