Atomicidade e Transações
Atomicidade
No MongoDB, uma operação de gravação é atômica no nível de um único documento, mesmo que a operação modifique vários documentos incorporados dentro de um único documento.
transações multidocumento
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.
Controle de Simultaneidade
O controle de simultaneidade permite que vários aplicativos sejam executados simultaneamente sem causar inconsistência de dados ou conflitos.
Uma operação do findAndModify
em um documento é atômica: se a condição de localização corresponder a um documento, a atualização será executada nesse documento. Queries simultâneas e atualizações adicionais nesse documento não serão afetadas até que a atualização atual seja concluída.
Considere o seguinte exemplo:
Uma collection com dois documentos:
db.myCollection.insertMany( [ { _id: 0, a: 1, b: 1 }, { _id: 1, a: 1, b: 1 } ] ) Duas das seguintes operações do
findAndModify
são executadas simultaneamente:db.myCollection.findAndModify( { query: { a: 1 }, update: { $inc: { b: 1 }, $set: { a: 2 } } } )
Depois que as operações findAndModify
forem concluídas, é garantido que a
e b
em ambos os documentos estejam definidos como 2
.
Você também pode criar um índice único em um campo para que ele possa ter somente valores únicos. Isso impede 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. Por exemplo, consulte Upsert findAndModify() com índice exclusivo.