Menu Docs
Página inicial do Docs
/ /

Atomicidade e Transações

No MongoDB, as operações de gravação são atômicas no nível de documento único, mesmo que modifiquem vários valores. Para atualizações paralelas, cada comando garante que a condição da query ainda corresponda.

Para evitar conflitos durante as atualizações simultâneas, inclua o valor atual esperado 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 atualização define score como 90 ou 100. A segunda atualização então não corresponde a { score: 80 } e não é executada.

Aviso

A filtragem em um campo que você não atualiza pode causar resultados inesperados durante as atualizações simultâneas. Considere estas operações:

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

Ambas as atualizações correspondem a { _id: 1 }, portanto, ambas são executadas. A segunda atualização substitui a primeira. O primeiro cliente não recebe aviso de que sua atualização foi perdida.

Para evitar conflitos ao filtrar em campos não atualizados,$inc utilize.

Por exemplo, considere as seguintes operações de atualização simultâneas:

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

Ambas as atualizações correspondem a { _id: 1 }. Como eles incrementam em vez de definir o valor, eles não se substituem. O score final é 110.

Dica

Store Unique Values

Para impor exclusividade, crie um índice único. Isso evita dados duplicados em inserções e atualizações. Você também pode criar índices únicos em múltiplos campos. Consulte Criar um índice exclusivo de campo único.

Esta seção descreve detalhes adicionais para transações com vários documentos.

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 do MongoDB

Nesta página