A resposta curta é sim para atomicidade.
No MongoDB, Transações (também chamadas de transações de vários documentos) estão associadas a uma sessão . Ou seja, você inicia uma transação para uma sessão. A qualquer momento, você pode ter no máximo um transação aberta para uma sessão.
Você não pode bloquear a coleção inteira para gravações. Você pode querer criar várias transações para garantir que as gravações não sejam entrelaçadas/substituídas entre seus processos. MongoDB usa Bloqueio Otimista em vez de Bloqueio Pessimista .
Da mesma forma nas transações de vários documentos do MongoDB. Por exemplo, usando mongo shell :
s1 = Mongo().startSession()
sessionTest = s1.getDatabase("databaseName").test;
s1.startTransaction()
sessionTest.find({a:"foo"})
> {_id: ObjectId(..), a:"foo", b:1}
// Let's update the record outside of the session (i.e. another process)
db.test.update({a:"foo"}, {$set:{b:2}})
sessionTest.update({a:"foo"}, {$set:{b:9}})
// You'll get a WriteConflict error because the the document has been modified outside of the session.
Observe também que, enquanto a transação está aberta, nenhuma alteração de dados feita por operações na transação é visível fora da transação.
- Quando uma transação é confirmada, todas as alterações de dados são salvas e visíveis fora da transação e a transação termina.
- Quando uma transação é abortada, todas as alterações de dados feitas pelas gravações na transação são descartadas sem nunca se tornarem visíveis e a transação termina.
Consulte também Exemplo de atomicidade .
Vale a pena notar que o MongoDB é um banco de dados distribuído , portanto, você também precisa estar ciente das diferentes opções de consistência. Você pode especificar essas opções ao iniciar Session.startTransaction() dependendo do caso de uso:
-
Leia o isolamento (leia a preocupação) :As transações de vários documentos do MongoDB suportam a preocupação de leitura "instantâneo ", "local " e "maioria ".
-
Escrever confirmação (Escrever preocupação) .
As transações de vários documentos suportam a preferência de leitura primário e todas as operações em uma determinada transação devem ser roteadas para o mesmo membro.
Você também pode estar interessado em Engineering Chalk and Talks:MongoDB Transactions vídeos que contêm algumas explicações técnicas por trás das transações do MongoDB.