sql >> Databáze >  >> NoSQL >> MongoDB

Transakce MongoDB 4.0:ACID čtení + zápis?

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í:

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.




  1. mongodb:jak aktualizovat prvek pole podle čísla indexu

  2. Požadavky GET na limit sazby

  3. Baňka:procházení úlohy pracovníka na pozadí (rq, redis)

  4. Získejte nejnovější dílčí dokument z Array