sql >> Databasteknik >  >> NoSQL >> MongoDB

Atomicitet, isolering och samtidighet i MongoDB

De flesta populära relationsdatabaser idag stöder  “ACID ” egenskaper – Atomicitet, konsistens, isolering och hållbarhet. Utvecklare och DBA:s (databasadministratörer) som arbetar med relationsdatabaser har en god förståelse för ACID-beteende. Men när du arbetar med NoSQL-databaser som MongoDB-molnet, finns det några viktiga skillnader som är viktiga för dig att förstå. MongoDB erbjuder stor flexibilitet i lagring, schema och skalning, men slappnar av några av ACID-egenskaperna. Det är viktigt att förstå skillnaderna när du modellerar dina data och utför MongoDB-kommandon.

Atomicitet

Wikipedia definierar "Atomicitet"  enligt följande – "I en atomär transaktion , en serie databasoperationer antingen alla inträffa, eller ingenting inträffar. En garanti för atomicitet förhindrar att uppdateringar av databasen endast sker delvis, vilket kan orsaka större problem än att avvisa hela serien direkt. Med andra ord betyder atomicitet odelbarhet och oreducerbarhet”.

MongoDB-skrivoperationer är atomära, bara på nivån för ett enda dokument. Om du ändrar flera underdokument i ett dokument är operationen fortfarande atomär, men om du ändrar flera dokument är operationen inte atomär. Så, hur uppnår du atomärt beteende över flera dokument? Du måste använda ett "tvåfas commit"-mönster för att uppnå önskad atomicitet. Här är ett bra exempel från MongoDB-dokumentationen om hur man implementerar detta mönster. Det tvåfasiga commit-mönstret är inte trivialt att implementera och få rätt – så se till att atomicitet för flera dokument är något du vill skjuta efter.

Isolering

Wikipedia definierar "Isolering" enligt följande – "I databassystem, isolering är en egenskap som definierar hur/när ändringarna som görs av en operation blir synliga för andra samtidiga operationer”. Det finns flera sätt att uppnå isolering med dina MongoDB-operationer, till exempel:

  1. “findAndModifyOperation()” Kommando

    Detta är ett av de enklaste sätten att fråga och ändra befintliga dokument. Kommandot kan returnera antingen de tidigare värdena för dokumenten eller de nya uppdaterade värdena för dokumenten. Du kan också sortera de matchande dokumenten, lägga upp och välja vilka fält som ska returneras:

    db.collection.findAndModify( {
                                   query: <document>,
                                   sort: <document>,
                                   remove: <boolean>,
                                   update: <document>,
                                   new: <boolean>,
                                   fields: <document>,
                                   upsert: <boolean>
                               } );
  2. "Uppdatera om aktuellt" mönster

    Det här mönstret är specificerat i MongoDB-dokumentationen. Det innebär mer manuellt arbete men ger dig mer kontroll.

  3. $isolation Operator

    Operatorn $isolation tillhandahåller ett sätt att isolera skrivningar till flera dokument. $isolation-operatören ger dock ingen allt-eller-inget-garanti – du måste använda några av de atomicitetstekniker som anges i det första avsnittet för att uppnå det. Dessutom fungerar inte $isolation-operatören för skärvor. Det här kommandot hette tidigare "$atomic" – det har nu bytt namn till "$isolated".

Samtidighet

MongoDB använder lås för att förhindra att flera klienter uppdaterar samma datastycke samtidigt. MongoDB 2.2+ använder "databas" nivålås. Så när en skrivoperation låser databasen, blockeras alla andra skrivoperationer till samma databas (även om de är till en separat samling) och väntar på låset. MongoDB använder  ”skribentgiriga” lås som gynnar skrivning framför läsning. I 2.2+ kan vissa långvariga operationer ge sina lås.

Trådsäkerhet

Alla MongoDB-klientklasser är inte trådsäkra – se dokumentationen för din specifika drivrutin för att kontrollera om klasserna du använder är trådsäkra. Till exempel, i Java-drivrutinen är MongoClient-klassen trådsäker. Så du kan använda en enda instans av den här klassen i alla dina trådar. Internt använder MongoClient en anslutningspool för att hantera anslutningar till MongoDB-servern.

Som alltid, om du har några frågor, vänligen kontakta oss på [email protected].


  1. MongoDB $replaceOne

  2. PHP kan inte hitta MongoDB-drivrutinen

  3. Hitta dokument med array som innehåller ett specifikt värde

  4. $projekt i $lookup mongodb