Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ /

Atomicidade e Transações

Nesta página

  • Exemplo

No MongoDB, uma operação de escrita é atômica no nível de um único documento, mesmo que a operação modifique vários valores. Quando vários comandos de atualização acontecem em paralelo, cada comando individual garante que a condição de query ainda corresponda.

Para garantir que os comandos de atualização simultâneas não entrem em conflito entre si, você pode especificar o valor atual esperado de um campo no filtro de atualização.

Considere uma collection com este documento:

db.games.insertOne( { _id: 1, score: 80 } )

Essas operações de atualização ocorrem simultaneamente:

// Update A
db.games.updateOne(
{ score: 80 },
{
$set: { score: 90 }
}
)
// Update B
db.games.updateOne(
{ score: 80 },
{
$set: { score: 100 }
}
)

Uma operação de atualização define o campo score do documento como 90 ou 100. Após a conclusão dessa atualização, a segunda operação de atualização não corresponde mais ao predicado de query { score: 80 } e não é executada.

Aviso

No caso de operações de atualização simultâneas, especificar um filtro em um campo que não está sendo atualizado pode levar a resultados inesperados. Por exemplo, considere se estas operações de atualização ocorrem simultaneamente:

// Update A
db.games.updateOne(
{ _id: 1 },
{
$set: { score: 90 }
}
)
// Update B
db.games.updateOne(
{ _id: 1 },
{
$set: { score: 100 }
}
)

Após a conclusão de uma operação de atualização, a operação restante ainda corresponde ao predicado de query { _id: 1 }. Como resultado, ambas as operações de atualização ocorrem e o valor score armazenado reflete a segunda operação de atualização. Isso é problemático porque o cliente que emitiu a primeira atualização não recebe nenhuma indicação de que a atualização foi substituída e o valor score é diferente do esperado.

Para evitar operações de gravação conflitantes quando o filtro de atualização estiver em um campo diferente daquele que está sendo atualizado, use o $inc operador.

Por exemplo, considere se estas operações de atualização ocorrem simultaneamente:

// Update A
db.games.updateOne(
{ _id: 1 },
{
$inc: { score: 10 }
}
)
// Update B
db.games.updateOne(
{ _id: 1 },
{
$inc: { score: 20 }
}
)

Após a conclusão de uma operação de atualização, a operação restante ainda corresponde ao predicado de query { _id: 1 }. No entanto, como as operações modificam o valor atual de score, elas não se substituem. Ambas as atualizações são refletidas e o score resultante é 110.

Dica

Store Unique Values

Para garantir que um campo tenha apenas valores únicos, você pode criar um índice único. Índices únicos impedem que inserções e atualizações criem dados duplicados. Você pode criar um índice único em múltiplos campos para garantir que a combinação de valores de campo seja única. Para obter exemplos, consulte Criar um índice único.

Quando uma única operação de gravação (por exemplo, db.collection.updateMany()) modifica vários documentos, a modificação de cada documento é atômica, mas a operação como um todo não é atômica.

Ao realizar operações de escrita de vários documentos, seja por meio de uma única operação de escrita ou de várias operações de escrita, outras operações podem ser intercaladas.

Para situações que exigem atomicidade de leituras e escritos em vários documentos (em uma única coleção ou várias coleções), o MongoDB suporta transações distribuídas, incluindo transações em conjuntos de réplicas e clusters fragmentados.

Para obter mais informações, consulte transações

Importante

Na maioria dos casos, uma transação distribuída incorre em um custo de desempenho maior do que as gravações de um único documento, e a disponibilidade de transações distribuídas não deve substituir o design eficaz do esquema. Em muitos cenários, o modelo de dados desnormalizado (documentos e arrays incorporados) continuará a ser ideal para seus dados e casos de uso. Ou seja, para muitos cenários, modelar seus dados adequadamente minimizará a necessidade de transações distribuídas.

Para considerações adicionais sobre o uso de transações (como limite de tempo de execução e limite de tamanho do oplog), consulte também Considerações de produção.

Isolamento de leitura, consistência e atualidade

Voltar

Conceitos de CRUD

Nesta página