sql >> Databasteknik >  >> NoSQL >> MongoDB

Varför använder MongoDB inte fsync()?

Anledningen är prestanda. Utan att behöva skriva till disken vid varje ändring kan MongoDB hantera uppdateringar snabbare.

MongoDB berättar när uppdateringar har levererats till servern, inte när uppdateringarna har skrivits , som du kan läsa i dokumentationen om Verifying Propagation av skrivningar med getLastError :

Detta går emot ACID , mer specifikt mot D, som står för hållbarhet :

ACID-egenskaper gäller för det mesta traditionella RDBMS-system. NoSQL-system, som inkluderar MongoDB, ger upp en eller flera av ACID-egenskaperna för att uppnå bättre skalbarhet. I MongoDB:s fall har hållbarheten offrats för bättre prestanda vid hantering av stora mängder uppdateringar.

MongoDB och ACID

De flesta ACID-egenskaper är garantier på transaktionsnivå . En transaktion är vanligtvis en grupp av frågor som ska behandlas som en enda enhet. MongoDB har inget koncept för transaktioner, återigen av prestandaskäl . Därför gäller de flesta ACID-egenskaper inte för MongoDB.

A — Atomicity säger att en transaktion antingen ska lyckas eller misslyckas. Det är inte tillåtet att delvis lyckas; om en del av transaktionen misslyckas ska hela transaktionen återställas. MongoDB stöder atomära operationer på dokumentnivå, men inte på "transaktionsnivå".

C — Konsistens hänvisar delvis till atomicitet, men inkluderar också referensintegritet . En relationsdatabas ansvarar för att se till att alla främmande nyckelreferenser är giltiga. MongoDB har inget koncept med främmande nycklar, så denna ACID-egenskap gäller inte.

Jag — Isolation anger att två samtidiga transaktioner inte får störa varandra; om två transaktioner försöker modifiera samma data, måste den andra transaktionen vänta på att den första ska slutföras. För att uppnå detta kommer databasen att låsa data. MongoDB har inget koncept för låsning, så det stöder inte isolering för flera operationer. Enstaka operationer är isolerade.

D — Hållbarhet beskrivs ovan. MongoDB stöder inte verklig hållbarhet (ännu) när det gäller hållbarhet med syrahaltig syra.

Nu kanske du tror att MongoDB är värdelös jämfört med RDBMS-system eftersom det saknar transaktioner och de flesta ACID-garantier. En del av anledningen till att transaktioner existerar är dock att relationsdatabaser måste behandla viss data som en en enhet , men dessa data har normaliserats till flera tabeller .

MongoDB låter dig lagra dina data som en enda enhet . Detta tar bort behovet av främmande nycklar och referensintegritet i de flesta fall. Du behöver inte heller transaktioner med flera frågor, eftersom du inte behöver flera tabeller för att uppdatera en enda enhet. De flesta gånger behöver du bara uppdatera ett enda dokument, och dessa operationer är atomära i MongoDB.

Enligt den första kommentaren på den här sidan , db.eval() ger isolering för flera operationer. Men enligt dokumentationen du vill vanligtvis undvika användningen av db.eval() .



  1. Hur exponerar jag en ny REST-metod för genom ett Spring Data MongoDB-förråd med ALPS/HATEOAS-metadata?

  2. MongoDB/Mongoose frågar vid ett specifikt datum?

  3. När en mongodb-markör kommer att upphöra

  4. Sortering av aggregering addToSet-resultat