数据仓库 ETL 过程正在查询可用性组中的只读辅助。ETL 过程使用一分钟的日期时间范围标准和读取提交的隔离级别以增量方式查询单个表。在执行时,符合条件的 5 条记录在主节点上提交,但另外 3 条时间戳比前 5 条稍早(但在条件范围内)的记录仍在打开的事务中。可用性组的性质是否要求所有事务都按 LSN 顺序应用(延迟所有 8 条记录的可见性,直到所有记录都被提交)或者延迟的 3 条记录是否获得稍后的 LSN 并在它们被提交后立即应用,可能在ETL 过程调整了它的日期标准?
数据仓库 ETL 过程正在查询可用性组中的只读辅助。ETL 过程使用一分钟的日期时间范围标准和读取提交的隔离级别以增量方式查询单个表。在执行时,符合条件的 5 条记录在主节点上提交,但另外 3 条时间戳比前 5 条稍早(但在条件范围内)的记录仍在打开的事务中。可用性组的性质是否要求所有事务都按 LSN 顺序应用(延迟所有 8 条记录的可见性,直到所有记录都被提交)或者延迟的 3 条记录是否获得稍后的 LSN 并在它们被提交后立即应用,可能在ETL 过程调整了它的日期标准?
REDO 要求按顺序应用 LSN,这不会在 AG 内部或外部发生变化。当 REDO 线程工作时,它必须按顺序执行日志记录。
没有延迟。在可用性组中,我们不发送单独的交易。我们也不会等待他们做出承诺。
传输单元是一个 LOG BLOCK,它是按顺序排列的 LOG RECORDS 的集合。这些日志块包含来自数据库中许多不同事务的日志记录,而不仅仅是您正在进行的 ETL 事务。此外,日志块在关闭并刷新到磁盘时发送,这有几个不同的原因,不一定需要来自提交。
这意味着辅助节点接收有关数据库中正在进行的所有事务的信息,这些事务正在进行更改。在这种情况下,二级交易拥有一些(如果不是全部的话)关于仍然开放的早期交易的信息。
现在,这触及了另一点。可读辅助服务器不使用
read committed
隔离级别,实际上它映射到幕后的快照隔离。这就是您看不到与前 3 笔交易有关的任何次要信息的原因。您不能添加nolock
到查询中,它不会让您看到数据。由于使用了快照隔离,我们将使用版本存储。这意味着如果您在次要事务上启动了一个事务来读取信息,并且在提交主事务上的打开事务时它仍在运行,那么在事务结束之前它不会“看到”它们。这是快照隔离的一部分。
总结一下:
当提交发生时,日志传输发生在辅助副本上。在提交的实际时刻之前,不会移动任何打开的事务。
因此,在您的情况下,延迟的 3 条记录将在提交后立即应用,这意味着您可以在辅助服务器上看到前 5 条。