Um processo ETL de data warehouse está consultando um secundário somente leitura em um grupo de disponibilidade. O processo ETL consulta uma única tabela de forma incremental usando critérios de intervalo de data e hora de um minuto e lê o nível de isolamento confirmado. No momento da execução, 5 registros que atendem aos critérios são confirmados no primário, mas outros 3, com timestamps ligeiramente anteriores aos primeiros 5 (mas dentro do intervalo de critérios) ainda estão em transações abertas. A natureza dos grupos de disponibilidade exige que todas as transações sejam aplicadas na ordem LSN (atrasando a visibilidade de todos os 8 registros até que todos sejam confirmados) ou os 3 registros atrasados obtêm LSNs posteriores e são aplicados assim que são confirmados, possivelmente após o O processo ETL ajustou seus critérios de data?
relate perguntas
-
SQL Server 2012 Criar índice com Sort In TempDb On - Gains False?
-
Transparência de failover do SQL Server AlwaysOn
-
Por que as sequências Denali devem ter um desempenho melhor do que as colunas de identidade?
-
O SQL Server não deveria oferecer suporte a RANGE?
-
O que é SQL Server "Denali"? O que há de novo?
O REDO exige que os LSNs sejam aplicados em ordem de sequência, isso não muda dentro ou fora de um AG. Quando a thread REDO estiver funcionando, ela terá que fazer os registros de log em ordem.
Não há demora. Nos Grupos de Disponibilidade, não enviamos transações individuais. Também não esperamos que eles se comprometam.
A unidade de transporte é um LOG BLOCK que é uma coleção de LOG RECORDS, em ordem. Esses blocos de log contêm registros de log de muitas transações diferentes no banco de dados e não apenas os ETL que você está realizando. Além disso, os blocos de log são enviados quando são fechados e liberados no disco, o que acontece por alguns motivos diferentes e não precisa necessariamente ser de um commit.
Isso significa que o secundário recebe informações sobre todas as transações que estão acontecendo no banco de dados que estão fazendo alterações. Nesse caso, o secundário possui parte, senão todas, das informações sobre as transações anteriores que ainda estão abertas.
Agora, isso atinge outro ponto. Os servidores secundários legíveis não estão usando o
read committed
nível de isolamento; na verdade, ele é mapeado para o isolamento de instantâneo nos bastidores. Esta é a razão pela qual você não pode ver nenhuma informação no secundário pertencente às 3 transações anteriores. Você não pode adicionarnolock
à consulta, não permitirá que você veja os dados.Como o isolamento de instantâneo é usado, usaremos o armazenamento de versão. Isso significa que se você iniciou uma transação no secundário para ler informações e ainda está em execução quando as transações abertas no primário são confirmadas, ele não as "verá" até que a transação termine. Isso faz parte do isolamento do instantâneo.
Para resumir:
O transporte de log ocorre para as réplicas secundárias quando ocorre a confirmação. Quaisquer transações abertas não serão movidas até o momento real do commit.
Portanto, na sua situação, os 3 registros atrasados serão aplicados assim que forem confirmados, o que significa que você pode ver os 5 primeiros no secundário.