我刚在这里读完一篇关于隔离级别的优秀文章。我们公司将很快开始开发我们当前产品的重写和扩展。我的愿望是拥有一个 OLTP 数据库和一个独立的、非规范化程度更高的报告数据库。假设我们有些自律,并且我们的大多数临时和报告类型查询实际上都进入了报告数据库,那么我们的 OLTP 数据库具有默认的已提交读隔离级别(我们不需要更严格的隔离级别)听起来合适吗OLTP 级别)和我们的报告数据库是快照隔离(可能是 RCSI)?
我的想法是,如果我们的 OLTP 数据库实际上是一个真正的 OLTP 数据库,而不是作为报告数据库的双重职责,我们就不需要快照隔离,也不需要它带来的相关开销。但是快照隔离在报告数据库上是可取的,这样读者就不会被不断传入的数据流阻塞,并且读取行的最后保存版本是可以接受的。
只是为了添加到另一个答案。
SQL Server 支持两种不同类型的 READ COMMITTED,即传统锁定 READ COMMITTED 和 READ COMMITTED SNAPSHOT。如果您曾经在锁定 READ COMMITTED 时构建和支持过大容量 OLTP 应用程序,您就会知道为什么引入 RCSI(除了可以轻松地将 Oracle 应用程序移植到 SQL Server 之外)。
锁定 READ COMMITTED 很难获得并发性,并且容易出现死锁,因为读者会阻止写入者,而写入者也会阻止读取者。死锁是应用程序中的一种错误,但众所周知,在测试中很难发现它们。因此,您有机会做出减少难以在测试中发现的错误数量的选择。那很值钱。RCSI 还增加了应用程序的并发性,使您能够更轻松地向上扩展以使用多个内核。
因此,RCSI 提高了应用程序的可伸缩性和可靠性,但代价是为 UPDATES 和 DELETES(以及 INSERTS,如果有触发器)和每行额外 14 个字节的额外簿记。
RCSI 总体上更易于编程,主要是当您想要读取一行并立即更新它时,有时需要使用 UPDLOCK 表提示选择加入锁定读取,并且需要确保没有其他会话执行同时发生同样的事情。
我不认为快照或 READ COMMITTED SNAPSHOT 一定会增加您的开销,这可能会导致性能下降——减少等待时间可能会增加吞吐量。
RCS 和 SNAPSHOT 的危险更多地与应用程序的编码方式有关——如果您的程序员在快照模式下执行查询时假定 READ COMMITTED 的阻塞语义,您可能会遇到麻烦。例如
在高吞吐量情况下可能会导致问题,因为多个读取器将同时获得相同的 MAX(bar) 值。
但是,您可能仍然需要某种形式的非 OLAP 操作报告和查询,而快照模式可以极大地提高性能。
我的观点是,您可以为 RCS 模式设计和开发您的 OLTP 系统,并且应该考虑它。毕竟,这几乎就是 Oracle 中大多数 OLTP 系统的编写方式。