sql >> Databáze >  >> NoSQL >> MongoDB

Atomicita, izolace a souběžnost v MongoDB

Většina oblíbených relačních databází dnes podporuje  “ACID vlastnosti – Atomicita, Konzistence, Izolace a Trvanlivost. Vývojáři a DBA (správci databází) pracující s relačními databázemi dobře rozumí chování ACID. Při práci s databázemi NoSQL, jako je cloud MongoDB, však existují některé klíčové rozdíly, kterým je důležité porozumět. MongoDB nabízí velkou flexibilitu v ukládání, schématu a škálování, ale uvolňuje některé vlastnosti ACID. Při modelování dat a provádění příkazů MongoDB je nezbytné porozumět rozdílům.

Atomicita

Wikipedia definuje „Atomicity“ následovně – „V atomové transakci , řadu databázových operací buď všechny dojít, nebo nic dochází. Garance atomicity zabraňuje aktualizacím databáze pouze částečně, což může způsobit větší problémy než úplné odmítnutí celé série. Jinými slovy atomicita znamená nedělitelnostneredukovatelnost“.

Operace zápisu MongoDB jsou atomické, pouze na úrovni jednoho dokumentu. Pokud upravujete více vnořených dokumentů v dokumentu, operace je stále atomická, ale pokud upravujete více dokumentů, operace atomická není. Jak tedy dosáhnete atomického chování ve více dokumentech? Abyste dosáhli požadované atomicity, musíte použít vzor „dvoufázového odevzdání“. Zde je skvělý příklad z dokumentace MongoDB, jak implementovat tento vzor. Implementace a správné provedení dvoufázového odevzdání není triviální – takže se ujistěte, že atomicita zápisu více dokumentů je něco, co chcete.

Izolace

Wikipedia definuje „izolaci“ následovně – „V databázových systémech izolace je vlastnost, která definuje, jak/kdy se změny provedené jednou operací stanou viditelnými pro jiné souběžné operace“. Existuje několik způsobů, jak dosáhnout izolace pomocí operací MongoDB, například:

  1. Příkaz „findAndModifyOperation()“

    Toto je jeden z nejjednodušších způsobů dotazování a úpravy existujících dokumentů. Příkaz může vrátit buď předchozí hodnoty dokumentů, nebo nové aktualizované hodnoty dokumentů. Můžete také seřadit odpovídající dokumenty, upsert a vybrat, která pole je třeba vrátit:

    db.collection.findAndModify( {
                                   query: <document>,
                                   sort: <document>,
                                   remove: <boolean>,
                                   update: <document>,
                                   new: <boolean>,
                                   fields: <document>,
                                   upsert: <boolean>
                               } );
  2. Vzor „Aktualizovat, pokud je aktuální“

    Tento vzor je uveden v dokumentaci  MongoDB. Zahrnuje více manuální práce, ale poskytuje vám větší kontrolu.

  3. Operátor $isolation

    Operátor $isolation poskytuje způsob, jak izolovat zápisy do více dokumentů. Operátor $isolation však neposkytuje záruku „všechno nebo nic“ – k dosažení toho budete muset použít některé techniky atomicity uvedené v první části. Operátor $isolation také nefunguje pro fragmenty. Tento příkaz se dříve jmenoval „$atomic“ – nyní byl správně přejmenován na „$isolated“.

Souběh

MongoDB používá zámky, které zabraňují více klientům aktualizovat stejná data ve stejnou dobu. MongoDB 2.2+ používá zámky úrovně „databáze“. Takže když jedna operace zápisu uzamkne databázi, všechny ostatní operace zápisu do stejné databáze (i když jsou do samostatné kolekce) jsou zablokovány a čekají na zámek. MongoDB používá zámky typu „writer greedy“, které upřednostňují zápis před čtením. Ve verzi 2.2+ se mohou některé dlouhotrvající operace zablokovat.

Bezpečnost vláken

Ne všechny třídy klienta MongoDB jsou bezpečné pro vlákna – podívejte se prosím do dokumentace vašeho konkrétního ovladače a zkontrolujte, zda jsou třídy, které používáte, bezpečné pro vlákna. Například v ovladači Java je třída MongoClient bezpečná pro vlákna. Takže můžete použít jednu instanci této třídy ve všech vašich vláknech. Interně MongoClient používá fond připojení ke správě připojení k serveru MongoDB.

Jako vždy, pokud máte nějaké dotazy, kontaktujte nás prosím na adrese [email protected].


  1. MongoDB $last Aggregation Pipeline Operator

  2. Mongodb třídí bez ohledu na malá a velká písmena

  3. Čas vytvoření klíče v redis

  4. MongoDB dropIndexes()