是否可以在只读可用性组辅助上使用“读取未提交”隔离级别?

Mar*_*ark 6 availability-groups snapshot-isolation sql-server-2019 query-performance

我们在 SQL 2019 企业版中使用可用性组。我们使用企业功能允许 AG 辅助节点处于只读模式,然后通过使用参数连接到侦听器来对辅助节点运行报告查询ApplicationIntent=ReadOnly

Read Uncommitted出于锁定和性能原因,我们有一些在主数据库上使用隔离级别运行的查询。

似乎在辅助设备上,所有隔离级别都转换为 RCSI,无论指定的锁定/隔离级别如何 - 可能是因为没有可能阻止 AG 同步的锁至关重要。

是否可以在辅助数据库上以“读取未提交”的方式运行查询,这大概也可以确保不采取任何锁定,但是,在某些情况下可以执行得更好,或者对于只读辅助数据库上的查询,它始终必须是 RCSI?

Eri*_*ing 13

斑竹

读取未提交/NOLOCK并不意味着您的查询不获取锁,而是意味着您的查询忽略其他查询获取的锁。这些提示确实应该被称为 NORESPECT。目前的命名非常具有误导性。它们让你容易返回脏读。

与任何其他读取查询一样,此隔离级别下的查询仍将采用架构稳定性锁。

对此的一个更简洁的实现是 RCSI,它为您提供当前由修改查询锁定的行的最后一个已知的良好版本,而不是潜在地从正在运行的数据中返回数据。

为了回答您的问题,通常本地查询提示将覆盖数据库级别的设置,例如Read Commied Snapshot IsolationSnapshot Isolation。但即使是查询级锁定提示也会被针对可读辅助节点的查询忽略:

将只读工作负载卸载到 Always On 可用性组的辅助副本

即使显式设置了其他事务隔离级别,针对辅助数据库运行的所有查询也会自动映射到快照隔离事务级别。此外,所有锁定提示都会被忽略。这消除了读者/作者的争用。

如果您已经使用其中一个或两个行版本控制隔离级别,则在边缘情况之外不应该有任何理由使用未提交读/NOLOCK。