sql >> Database >  >> NoSQL >> MongoDB

Atomiciteit, isolatie en gelijktijdigheid in MongoDB

De meest populaire relationele databases ondersteunen tegenwoordig  'ACID ” eigenschappen - Atomiciteit, Consistentie, Isolatie en Duurzaamheid. Ontwikkelaars en DBA's (Database Administrators) die met relationele databases werken, hebben een goed begrip van ACID-gedrag. Wanneer u echter met NoSQL-databases zoals MongoDB cloud werkt, zijn er enkele belangrijke verschillen die belangrijk voor u zijn om te begrijpen. MongoDB biedt grote flexibiliteit in opslag, schema en schaling, maar versoepelt enkele van de ACID-eigenschappen. Het is essentieel om de verschillen te begrijpen terwijl u uw gegevens modelleert en MongoDB-opdrachten uitvoert.

Atomiciteit

Wikipedia definieert 'Atomicity'  als volgt:'In een atomaire transactie , een reeks databasebewerkingen ofwel alle optreden, of niets komt voor. Een garantie van atomiciteit voorkomt dat updates van de database slechts gedeeltelijk plaatsvinden, wat grotere problemen kan veroorzaken dan het volledig afwijzen van de hele serie. Met andere woorden, atomiciteit betekent ondeelbaarheid en onherleidbaarheid”.

MongoDB-schrijfbewerkingen zijn atomair, alleen op het niveau van een enkel document. Als u meerdere subdocumenten in een document wijzigt, is de bewerking nog steeds atomair, maar als u meerdere documenten wijzigt, is de bewerking niet atomair. Dus, hoe bereik je atomair gedrag in meerdere documenten? U moet een "tweefasig commit"-patroon gebruiken om de gewenste atomischheid te bereiken. Hier is een goed voorbeeld uit de MongoDB-documentatie over het implementeren van dit patroon. Het tweefasige commit-patroon is niet triviaal om te implementeren en goed te doen - dus zorg ervoor dat de atomiciteit van het schrijven van meerdere documenten iets is waar je naar wilt streven.

Isolatie

Wikipedia definieert 'Isolatie' als volgt:'In database systemen, isolatie is een eigenschap die definieert hoe/wanneer de wijzigingen die door één bewerking zijn aangebracht, zichtbaar worden voor andere gelijktijdige bewerkingen'. Er zijn meerdere manieren om isolatie te bereiken met uw MongoDB-bewerkingen, bijvoorbeeld:

  1. "findAndModifyOperation()"-opdracht

    Dit is een van de eenvoudigste manieren om bestaande documenten op te vragen en te wijzigen. De opdracht kan de vorige waarden van de documenten of de nieuwe bijgewerkte waarden van de documenten retourneren. U kunt ook de overeenkomende documenten sorteren, upsert en selecteren welke velden moeten worden geretourneerd:

    db.collection.findAndModify( {
                                   query: <document>,
                                   sort: <document>,
                                   remove: <boolean>,
                                   update: <document>,
                                   new: <boolean>,
                                   fields: <document>,
                                   upsert: <boolean>
                               } );
  2. Patroon "Update indien actueel"

    Dit patroon wordt gespecificeerd in de MongoDB-documentatie. Het brengt meer handmatig werk met zich mee, maar geeft je meer controle.

  3. $isolation Operator

    De $isolation-operator biedt een manier om schrijfbewerkingen naar meerdere documenten te isoleren. De $isolation-operator biedt echter geen alles-of-niets-garantie - u moet enkele van de atomiciteitstechnieken gebruiken die in het eerste gedeelte zijn gespecificeerd om dat te bereiken. Ook werkt de $isolation-operator niet voor shards. Dit commando heette vroeger "$atomic" - het is nu correct hernoemd naar "$isoated".

Gelijktijdigheid

MongoDB gebruikt vergrendelingen om te voorkomen dat meerdere clients hetzelfde stuk gegevens tegelijkertijd bijwerken. MongoDB 2.2+ maakt gebruik van "database"-niveauvergrendelingen. Dus wanneer één schrijfbewerking de database vergrendelt, worden alle andere schrijfbewerkingen naar dezelfde database (zelfs als ze naar een aparte verzameling zijn) geblokkeerd terwijl ze wachten op de vergrendeling. MongoDB gebruikt 'writer greedy' vergrendelingen die de voorkeur geven aan schrijven boven lezen. In 2.2+ kunnen bepaalde langlopende operaties hun sloten opleveren.

Draadveiligheid

Niet alle MongoDB-clientklassen zijn thread-safe - raadpleeg de documentatie van uw specifieke stuurprogramma om te controleren of de klassen die u gebruikt, thread-safe zijn. In het Java-stuurprogramma is de MongoClient-klasse bijvoorbeeld thread-safe. U kunt dus één exemplaar van deze klasse in al uw threads gebruiken. Intern gebruikt MongoClient een verbindingspool om verbindingen met de MongoDB-server te beheren.

Zoals altijd, als je vragen hebt, neem dan contact met ons op via [email protected].


  1. mongo-commando wordt niet herkend bij het proberen verbinding te maken met een mongodb-server

  2. Redis cluster failover:slave wordt geen master

  3. Meteor:onverwachte mongo-exitcode 100

  4. Redis INCRBY met limieten