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:
-
“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> } );
-
"Opdater hvis aktuelt" mønster
Dette mønster er angivet i MongoDB-dokumentationen. Det involverer mere manuelt arbejde, men giver dig mere kontrol.
-
$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].