快照隔离与已提交读 - OLTP 和报告数据库

Ran*_*der 2 sql-server isolation-level snapshot-isolation

我刚刚读完隔离级别的优秀文章在这里。我们公司将很快开始对我们当前产品的重写和扩展开发。我的愿望是拥有一个 OLTP 数据库和一个单独的、更加非规范化的报告数据库。假设我们有一定的纪律性,并且我们的大多数临时和报告类型查询实际上都转到报告数据库,那么我们的 OLTP 数据库具有读取提交的默认隔离级别(我们不需要更严格的隔离级别)听起来合适吗? OLTP 级别)和我们的报告数据库是快照隔离(可能是 RCSI)?

我的想法是,如果我们的 OLTP 数据库实际上是一个真正的 OLTP 数据库并且不作为报告数据库提供双重职责,我们将不需要快照隔离及其相关的开销。但是快照隔离在报告数据库上是可取的,这样读者就不会被不断传入的数据流阻塞,并且读取最后保存的行版本是可以接受的。

Dav*_*oft 8

只是为了补充另一个答案。

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 表提示选择锁定读取,并且需要确保没有其他会话执行同时做同样的事情。