Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

Consistência causal e write and read concerns

Com as sessões de cliente causalmente consistentes do MongoDB, diferentes combinações de preocupações de leitura e gravação fornecem diferentes garantias de consistência causal.

A tabela a seguir indica as garantias específicas fornecidas por diferentes combinações:

Preocupação de leitura
Escreva preocupação
Ler as próprias gravações
Leituras monotônicas
Escritas monotônicas
Escritas que seguem as leituras

Se você quiser consistência causal com durabilidade de dados, então, como visto na tabela, somente as operações de leitura com read concern "majority" e as operações de escrita com write concern "majority" podem garantir as quatro garantias de consistência causal. Ou seja, sessões de clientes com consistência causal só podem garantir a consistência causal para:

  • Operações de leitura com read concern "majority"; Em outras palavras, as operações de leitura que retornam dados que foram reconhecidos pela maioria dos membros do conjunto de réplicas e são duráveis.

  • Operações de gravação com preocupação de gravação "majority" ; em outras palavras, as operações de gravação que solicitam o reconhecimento de que a operação foi aplicada à maioria dos membros com direito a voto do conjunto de réplicas.

Se você quiser consistência causal sem durabilidade de dados (o que significa que as gravações podem ser revertidas), as operações de gravação com preocupação de gravação { w: 1 } também poderão fornecer consistência causal.

Observação

As outras combinações de read e write concerns também podem satisfazer as quatro garantias de consistência causal em algumas situações, mas não necessariamente em todas as situações.

A preocupação de leitura "majority" e a preocupação de gravação "majority" asseguram que as quatro garantias de consistência causal sejam mantidas mesmo em circunstâncias (como em uma partição de rede) em que dois membros em um conjunto de réplicas acreditam transitoriamente que são os principais. E embora ambos os primários possam concluir gravações com { w: 1 } preocupação de gravação, apenas um primário será capaz de concluir gravações com "majority" preocupação de gravação.

Por exemplo, considere uma situação em que uma partição de rede divide um conjunto de réplica de cinco membros:

Partição de rede: novo primary escolhido por um lado, mas o antigo primary ainda não renunciou.

Exemplo

Com a partição acima

  • As escritas com write concern "majority" podem ser concluídas em P new, mas não podem ser concluídas em P old.

  • As gravações com preocupação de gravação { w: 1 } podem ser concluídas em P antigo ou P novo. No entanto, as gravações em P antigas (bem como as gravações replicadas para S 1) são revertidas quando esses membros recuperam a comunicação com o restante do conjunto de réplicas.

  • Depois de uma gravação bem-sucedida com "majority" preocupação de gravação em P novas e causalmente consistentes com "majority" preocupação de gravação pode observar a escrita em P novo, S 2 e S 3. As leituras também podem observar a gravação em P antigo e S 1, uma vez que podem se comunicar com o resto do conjunto de réplicas e sincronizar com os outros membros do conjunto de réplicas. Quaisquer gravações feitas em P antigo e/ou replicadas em S 1 durante a partição serão revertidas.

Para ilustrar os requisitos de read e write concern, nos exemplos a seguir, um cliente realiza uma sequência de operações com diferentes combinações de read e write concerns no conjunto de réplicas:

O uso de "majority" de preocupação de leitura e "majority" de preocupação de escrita em uma sessão causalmente consistente fornece as seguintes garantias de consistência causal:

✅ Ler as próprias escritas ✅ Leituras monotônicas ✅ Escritas monotônicas ✅ As escritas seguem as leituras

Observação

Cenário 1 (Leia Preocupação "maioria" e Preocupação de Gravação "maioria")

Durante o período transitório com dois primaries, como somente P new pode realizar escritas com write concern { w: "majority" }, uma sessão de cliente pode emitir a seguinte sequência de operações com sucesso:

Sequência
Exemplo
1. Escrever 1 com write concern "majority" em P new
2. Leia 1 com preocupação de leitura "majority" a S 2
3. Escrever 2 com preocupação de escrita "majority" a P novo

4. Leia 2 com preocupação de leitura "majority" a S 3
Para o item A, atualize qty para 50.
Ler o item A.
Para itens com qty menor ou igual a 50,
atualizar restock para true.
Ler o item A.
Estado dos dados com duas primárias usando preocupação de leitura maioria e preocupação de gravação maioria
clique para ampliar
Ler as próprias gravações
A leitura 1 lê dados de S 2 que refletem um estado após a gravação 1.
A leitura 2 lê dados do S 3 que refletem um estado após a Gravação 1 seguida pela Gravação 2.
Leituras monotônicas
A leitura 2 lê dados de S 3 que refletem um estado após a leitura 1.
Escritas monotônicas
A escrita 2 atualiza dados em P novos que reflitam um estado após a gravação 1.
Escritas que seguem as leituras
A gravação 2 atualiza os dados no P novo que reflete um estado dos dados após a leitura 1 (o que significa que um estado anterior reflete a leitura dos dados pela gravação 1).

Observação

Cenário 2 (Preocupação de leitura "maioria" e Preocupação de gravação "maioria")

Considere uma sequência alternativa em que a leitura 1 com a preocupação de leitura "majority" é direcionado para S 1:

Sequência
Exemplo
1. Escrever 1 com write concern "majority" em P new
2. Leia 1 com preocupação de leitura "majority" a S 1
3. Escrever 2 com preocupação de escrita "majority" a P novo

4. Leia 2 com a preocupação de leitura "majority" a S 3
Para o item A, atualize qty para 50.
Ler o item A.
Para itens com qty menor ou igual a 50,
atualizar restock para true.
Ler o item A.

Nessa sequência, a leitura 1 não pode retornar até que o ponto de confirmação da maioria tenha avançado sobre P antigo. Isso não pode ocorrer até que P o antigo e S 1 possam se comunicar com o restante do conjunto de réplicas; nesse momento, P antigo deixou o cargo (se ainda não houver) e os dois membros sincronizam (incluindo Gravação 1) dos outros membros do conjunto de réplicas.

Ler as próprias gravações
A leitura 1 reflete um estado de dados após Gravar1 1, embora após a partição de rede ter curado e o membro tenha sincronizado dos outros membros do conjunto de réplicas.
A leitura 2 lê dados de S 3 que refletem um estado após a gravação 1 seguido por Gravação 2.
Leituras monotônicas
A leitura 2 lê dados da S 3 que refletem um estado após a leitura 1 (o que significa que um estado anterior é refletido nos dados lidos pela leitura 1).
Escritas monotônicas
A escrita 2 atualiza dados em P novos que reflitam um estado após a gravação 1.
Escritas que seguem as leituras
A gravação 2 atualiza os dados no P novo que reflete um estado dos dados após a leitura 1 (o que significa que um estado anterior reflete a leitura dos dados pela gravação 1).

O uso da read concern "majority" e da write concern { w: 1 } em uma sessão com consistência causal fornece as seguintes garantias de consistência causal se você quiser consistência causal com durabilidade de dados:

✅ Ler as próprias escritas ✅ Leituras monotônicas ✅ Escritas monotônicas ✅ As escritas seguem as leituras

Se você quiser consistência causal sem durabilidade de dados:

✅ Ler as próprias escritas ✅ Leituras monotônicas ✅ Escritas monotônicas ✅ As escritas seguem as leituras

Observação

Cenário 3 (Preocupação de leitura "maioria" e Preocupação de gravação {w: 1})

Durante o período transitório com dois primários, como P antigo e P novo podem realizar gravações com relação à gravação { w: 1 }, uma sessão de cliente pode emitir a seguinte sequência de operações com sucesso, mas não ser causalmente consistente se você quiser consistência causal com durabilidade de dados:

Sequência
Exemplo
1. Escreva 1 com preocupação de escrever{ w: 1 } para P velho
2. Leia 1 com preocupação de leitura "majority" a S 2
3. Escrever 2 com preocupação de escrita { w: 1 } a P novo

4. Leia 2 com a preocupação de leitura "majority" a S 3
Para o item A, atualize qty para 50.
Ler o item A.
Para itens com qty menor ou igual a 50,
atualizar restock para true.
Ler o item A.
Estado dos dados com dois primários usando preocupação de leitura maioria e preocupação de gravação 1
clique para ampliar

Nesta sequência,

  • A leitura 1 não pode retornar até que o ponto de confirmação da maioria tenha avançado em P novo após a hora da gravação 1.

  • A leitura 2 não pode retornar até que o ponto de confirmação da maioria tenha avançado em P novo após a hora da gravação 2.

  • A gravação 1 será revertida quando a partição da rede for curada.

Se você quiser consistência causal com durabilidade de dados

Leia suas próprias escritas
A leitura 1 lê dados de S 2 que não refletem um estado após a gravação 1.
Leituras monotônicas
A leitura 2 lê dados da S 3 que refletem um estado após a leitura 1 (o que significa que um estado anterior é refletido nos dados lidos pela leitura 1).
Escritas monotônicas
A gravação 2 atualiza os dados em P novo que não reflete um estado após a gravação 1.
Escritas que seguem as leituras
A gravação 2 atualiza os dados em P novo que reflete um estado após a leitura 1 (o que significa que um estado anterior reflete os dados lidos pela leitura 1).

Se você quiser consistência causal sem durabilidade de dados

Ler as próprias gravações
Leia 1 lê dados de S 2 retorna dados que refletem um estado equivalente à gravação 1 seguido de reversão da gravação 1.
Leituras monotônicas
A leitura 2 lê dados da S 3 que refletem um estado após a leitura 1 (o que significa que um estado anterior é refletido nos dados lidos pela leitura 1).
Escritas monotônicas
Gravar 2 atualiza dados em P novo que é equivalente a após a Gravação 1 seguido pela reversão da Gravação 1.
Escritas que seguem as leituras
Gravar 2 atualiza dados em P novo que reflete um estado após a Leitura 1 (ou seja, cujo estado anterior reflete os dados lidos pela Leitura 1 ).

Observação

Cenário 4 (Preocupação de leitura "maioria" e Preocupação de gravação {w: 1})

Considere uma sequência alternativa em que a leitura 1 com a preocupação de leitura "majority" é direcionado para S 1:

Sequência
Exemplo
1. Escreva 1 com preocupação de escrever{ w: 1 } para P velho
2. Leia 1 com preocupação de leitura "majority" a S 1
3. Escrever 2 com preocupação de escrita { w: 1 } a P novo

4. Leia 2 com a preocupação de leitura "majority" a S 3
Para o item A, atualize qty para 50.
Ler o item A.
Para itens com qty menor ou igual a 50,
atualizar restock para true.
Ler o item A.

Nesta sequência:

  • A leitura 1 não pode retornar até que o ponto de confirmação majoritário tenha avançado em S 1. Isso não pode ocorrer até que P antigo e S 1 possam se comunicar com o resto do conjunto de réplicas. Nesse momento, P antigo foi desativado (se ainda não), Gravação 1 é revertido de P antigo e S 1 e os dois membros são sincronizados com os outros membros do conjunto de réplicas.

Se você quiser consistência causal com durabilidade de dados

Leia suas próprias escritas
Os dados lidos pela Leitura 1 não refletem os resultados da Gravação 1, que foi revertida.
Leituras monotônicas
A leitura 2 lê dados de S 3 que refletem um estado após a leitura 1 (ou seja, cujo estado anterior reflete os dados lidos pela leitura 1).
Escritas monotônicas
A gravação 2 atualiza os dados em P novo que não reflete um estado após a gravação 1, que tinha precedido a gravação 2, mas voltou atrás.
Escritas que seguem as leituras
Gravar 2 atualiza dados em P novo que reflete um estado após a Leitura 1 (ou seja, cujo estado anterior reflete os dados lidos pela Leitura 1 ).

Se você quiser consistência causal sem durabilidade de dados

Ler as próprias gravações
A Leitura 1 retorna dados que refletem o resultado final da Gravação 1 , já que a Gravação 1 é revertida.
Leituras monotônicas
A leitura 2 lê dados de S 3 que refletem um estado posterior à leitura 1 (o que significa que um estado anterior reflete os dados lidos pela leitura 1).
Escritas monotônicas
Gravar 2 atualiza dados em P novo que é equivalente a após a Gravação 1 seguido pela reversão da Gravação 1.
Escritas que seguem as leituras
A gravação 2 atualiza os dados em P novo que reflete um estado após a leitura 1 (o que significa que um estado anterior reflete os dados lidos pela leitura 1).

O uso de "local" de preocupação de leitura e preocupação de escrita { w: 1 } em uma sessão causalmente consistente não pode garantir consistência causal.

✅ Ler as próprias escritas ✅ Leituras monotônicas ✅ Escritas monotônicas ✅ As escritas seguem as leituras

Essa combinação pode satisfazer as quatro garantias de consistência causal em algumas situações, mas não necessariamente em todas.

Observação

Cenário 5 (Preocupação de leitura "local" e Preocupação de Gravação {w: 1})

Durante esse período transitório, como P old e P new podem realizar gravações com write concern { w: 1 }, uma sessão de cliente pode emitir a seguinte sequência de operações com sucesso, mas sem consistência causal:

Sequência
Exemplo
1. Escreva 1 com preocupação de escrever{ w: 1 } para P velho
2. Leia 1 com preocupação de leitura "local" a S 1
3. Escrever 2 com preocupação de escrita { w: 1 } a P novo

4. Leia 2 com preocupação de leitura "local" a S 3
Para o item A, atualize qty para 50.
Ler o item A.
Para itens com qty menor ou igual a 50,
atualizar restock para true.
Ler o item A.
Estado dos dados com dois primaries usando read concern local e write concern 1
clique para ampliar
❌ Ler as próprias escritas
A leitura 2 lê dados de S 3 que refletem somente um estado após a gravação 2 e não a gravação 1 seguido pela gravação 2.
❌ Leituras monotônicas
A leitura 2 lê dados de S 3 que não refletem um estado após Ler 1 (o que significa que um estado anterior não refletem os dados lidos por Ler 1).
❌ Escritas monotônicas
A gravação 2 atualiza os dados em P novo que não reflete um estado após a gravação 1.
❌ Escrever, seguir, ler
A gravação 2 atualiza os dados em P novo que não reflete um estado após a leitura 1 (o que significa que um estado anterior não reflete os dados lidos pela leitura 1).

O uso de "local" de preocupação de leitura e "majority" de preocupação de escrita em uma sessão causalmente consistente fornece as seguintes garantias de consistência causal:

✅ Ler as próprias escritas ✅ Leituras monotônicas ✅ Escritas monotônicas ✅ As escritas seguem as leituras

Essa combinação pode satisfazer as quatro garantias de consistência causal em algumas situações, mas não necessariamente em todas.

Observação

Cenário 6 (Preocupação de leitura "local" e Preocupação de gravação "maioria")

Durante esse período transitório, como somente P new pode realizar escritas com write concern { w: "majority" }, uma sessão de cliente pode emitir a seguinte sequência de operações com sucesso, mas sem consistência causal:

Sequência
Exemplo
1. Escrever 1 com write concern "majority" em P new
2. Leia 1 com preocupação de leitura "local" a S 1
3. Escrever 2 com preocupação de escrita "majority" a P novo

4. Leia 2 com preocupação de leitura "local" a S 3
Para o item A, atualize qty para 50.
Ler o item A.
Para itens com qty menor ou igual a 50,
atualizar restock para true.
Ler o item A.
Estado dos dados com dois primários usando preocupação de leitura local e preocupação de gravação maioria
clique para ampliar
❌ Ler as próprias escritas.
A leitura 1 lê dados de S 1 que não refletem um estado após a gravação 1.
❌ Leituras monotônicas.
A leitura 2 lê dados de S 3 que não refletem um estado após Ler 1 (o que significa que um estado anterior não refletem os dados lidos por Ler 1).
✅ Escritas monotônicas.
A escrita 2 atualiza dados em P novos que reflitam um estado após a gravação 1.
❌ Escrever, seguir, ler.
A gravação 2 atualiza os dados em P novo que não reflete um estado após a leitura 1 (o que significa que um estado anterior não reflete os dados lidos pela leitura 1).
← Isolamento de leitura, consistência e atualidade