Krátká odpověď je ano pro atomicitu.
V MongoDB, Transakce (také nazývané transakce s více dokumenty) jsou spojeny s relací . To znamená, že zahájíte transakci pro relaci. V danou chvíli můžete mít maximálně jednu otevřít transakci pro relaci.
Nemůžete zamknout celou sbírku pro zápisy. Možná budete chtít vytvořit více transakcí, abyste zajistili, že se zápisy nebudou prokládat/přepisovat mezi vašimi procesy. MongoDB používá Optimistické zamykání místo pesimistické zamykání .
Podobně v transakcích s více dokumenty MongoDB. Například pomocí 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.
Všimněte si také, že když je transakce otevřená, žádné změny dat provedené operacemi v transakci nejsou viditelné mimo transakci.
- Když se transakce potvrdí, všechny změny dat se uloží a budou viditelné mimo transakci a transakce skončí.
- Když se transakce přeruší, všechny změny dat provedené zápisy v transakci jsou zahozeny, aniž by byly někdy viditelné, a transakce skončí.
Viz také Příklad atomicity .
Stojí za zmínku, že MongoDB je distribuovaná databáze , takže si také musíte být vědomi různých možností konzistence. Tyto možnosti můžete zadat při spouštění Session.startTransaction() v závislosti na případu použití:
-
Read Isolation (Read Concern) :Podpora transakcí s více dokumenty MongoDB problém čtení "snímek ", "místní “ a „většina ".
."
Transakce s více dokumenty podporují předvolbu čtení primární a všechny operace v dané transakci musí směřovat ke stejnému členovi.
Také by vás mohlo zajímat Engineering Chalk and Talks:MongoDB Transactions videa, která obsahují některá technická vysvětlení transakcí MongoDB.