sql >> Database teknologi >  >> NoSQL >> MongoDB

Atomicitet, isolation og samtidighed i MongoDB

De fleste populære relationsdatabaser i dag understøtter  “ACID ” egenskaber – Atomicitet, Konsistens, Isolation og Holdbarhed. Udviklere og DBA'er (databaseadministratorer), der arbejder med relationelle databaser, har en god forståelse for ACID-adfærd. Men når du arbejder med NoSQL-databaser som MongoDB cloud, er der nogle vigtige forskelle, som er vigtige for dig at forstå. MongoDB tilbyder stor fleksibilitet i lagring, skema og skalering, men slækker på nogle af ACID-egenskaberne. Det er vigtigt at forstå forskellene, når du modellerer dine data og udfører MongoDB-kommandoer.

Atomicitet

Wikipedia definerer "Atomicitet"  som følger - "I en atomær transaktion , en række databaseoperationer enten alle forekomme, eller ingenting opstår. En garanti for atomicitet forhindrer, at opdateringer til databasen kun sker delvist, hvilket kan forårsage større problemer end at afvise hele serien. Med andre ord betyder atomicitet udelelighed og ureducerbarhed”.

MongoDB skriveoperationer er atomare, kun på niveau med et enkelt dokument. Hvis du ændrer flere underdokumenter inde i et dokument, er operationen stadig atomisk, men hvis du ændrer flere dokumenter, er operationen ikke atomisk. Så hvordan opnår du atomær adfærd på tværs af flere dokumenter? Du skal bruge et "to-faset commit"-mønster for at opnå den ønskede atomicitet. Her er et godt eksempel fra MongoDB-dokumentationen om, hvordan man implementerer dette mønster. Det to-fasede commit-mønster er ikke-trivielt at implementere og få det rigtige – så sørg for, at atomicitet til flere dokumenter er noget, du vil skyde efter.

Isolation

Wikipedia definerer "Isolation" som følger - "I databasesystemer, isolation er en egenskab, der definerer, hvordan/hvornår ændringerne foretaget af én handling bliver synlige for andre samtidige handlinger”. Der er flere måder at opnå isolering med dine MongoDB-operationer, for eksempel:

  1. “findAndModifyOperation()” Kommando

    Dette er en af ​​de enkleste måder at forespørge på og ændre eksisterende dokumenter på. Kommandoen kan returnere enten de tidligere værdier for dokumenterne eller de nye opdaterede værdier for dokumenterne. Du kan også sortere de matchende dokumenter, opsætte og vælge hvilke felter der skal returneres:

    db.collection.findAndModify( {
                                   query: <document>,
                                   sort: <document>,
                                   remove: <boolean>,
                                   update: <document>,
                                   new: <boolean>,
                                   fields: <document>,
                                   upsert: <boolean>
                               } );
  2. "Opdater hvis aktuelt" mønster

    Dette mønster er angivet i MongoDB-dokumentationen. Det involverer mere manuelt arbejde, men giver dig mere kontrol.

  3. $isolation Operator

    $isolation-operatoren giver mulighed for at isolere skrivninger til flere dokumenter. $isolation-operatøren giver dog ikke alt-eller-intet-garanti - du skal bruge nogle af de atomicitetsteknikker, der er specificeret i det første afsnit for at opnå det. Desuden virker $isolation-operatøren ikke for shards. Denne kommando hed tidligere "$atomic" - den er nu korrekt omdøbt til "$isolated".

Samtidig

MongoDB bruger låse til at forhindre flere klienter i at opdatere det samme stykke data på samme tid. MongoDB 2.2+ bruger "database" niveaulåse. Så når en skriveoperation låser databasen, blokeres alle andre skriveoperationer til den samme database (selvom de er til en separat samling) og venter på låsen. MongoDB bruger "skribentgrådige" låse, som favoriserer skrivning frem for læsning. I 2.2+ kan visse langvarige operationer give deres låse.

Trådsikkerhed

Ikke alle MongoDB-klientklasserne er trådsikre - se venligst dokumentationen til din specifikke driver for at kontrollere, om de klasser, du bruger, er trådsikre. For eksempel i Java-driveren er MongoClient-klassen trådsikker. Så du kan bruge en enkelt forekomst af denne klasse på tværs af alle dine tråde. Internt bruger MongoClient en forbindelsespulje til at administrere forbindelser til MongoDB-serveren.

Som altid, hvis du har spørgsmål, bedes du kontakte os på [email protected].


  1. MongoDB returnerer True, hvis dokumentet findes

  2. En oversigt over Percona Backup til MongoDB

  3. Mongo push til array inde i array

  4. Er der en måde at "smuk" udskrive MongoDB shell output til en fil?