sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB 4.0 Transaktioner:ACID Läsa + Skriva?

Det korta svaret är ja för atomicitet.

I MongoDB, Transaktioner (även kallade transaktioner med flera dokument) är associerade med en session . Det vill säga att du startar en transaktion för en session. När som helst kan du ha högst ett öppen transaktion för en session.

Du kan inte låsa hela samlingen för att skriva. Du kanske vill skapa flera transaktioner för att säkerställa att skrivningar inte sammanflätas/överskrider mellan dina processer. MongoDB använder Optimistisk låsning istället för Pessimistisk låsning .

På samma sätt i MongoDB multi-dokument transaktioner. Använd till exempel mongo-skal :

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. 

Observera också att medan transaktionen är öppen är inga dataändringar gjorda av operationer i transaktionen synliga utanför transaktionen.

  • När en transaktion genomförs, sparas alla dataändringar och syns utanför transaktionen och transaktionen avslutas.
  • När en transaktion avbryts kasseras alla dataändringar som gjorts av skrivningarna i transaktionen utan att någonsin bli synliga och transaktionen avslutas.

Se även Atomicitetsexempel .

Värt att notera att MongoDB är en distribuerad databas , så du måste också vara medveten om de olika alternativen för konsistens. Du kan ange dessa alternativ när du initierar Session.startTransaction() beroende på användningsfallet:

Transaktioner med flera dokument stöder läspreferens primär och alla operationer i en given transaktion måste dirigeras till samma medlem.

Du kanske också är intresserad av Engineering Chalk and Talks:MongoDB Transactions videor som innehåller några tekniska förklaringar bakom MongoDB-transaktioner.




  1. Oändligt återhämtande tillstånd av sekundär

  2. Lagrar returvärdet för node.js setTimeout i redis

  3. Få sorterade distinkta värden med MongoTemplate

  4. Vad är skillnaden mellan skärning och replikering i Mongo?