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

Atomicità, isolamento e concorrenza in MongoDB

I database relazionali più diffusi oggi supportano  “ACID ” proprietà – Atomicità, Consistenza, Isolamento e Durabilità. Gli sviluppatori e i DBA (Amministratori di database) che lavorano con i database relazionali hanno una buona comprensione del comportamento dell'ACID. Tuttavia, quando si lavora con database NoSQL come MongoDB cloud, ci sono alcune differenze chiave che è importante comprendere. MongoDB offre grande flessibilità in termini di archiviazione, schema e ridimensionamento, ma rilassa alcune delle proprietà ACID. È essenziale comprendere le differenze mentre modelli i tuoi dati ed esegui i comandi MongoDB.

Atomicità

Wikipedia definisce "Atomicità"  come segue:"In una transazione atomica , una serie di operazioni sul database tutte verificarsi o nulla si verifica. Una garanzia di atomicità evita che gli aggiornamenti al database avvengano solo in parte, il che può causare maggiori problemi poi respingere l'intera serie a titolo definitivo. In altre parole, atomicità significa indivisibilitàirriducibilità”.

Le operazioni di scrittura di MongoDB sono atomiche, solo a livello di un singolo documento. Se stai modificando più documenti secondari all'interno di un documento, l'operazione è ancora atomica, ma se stai modificando più documenti, l'operazione non è atomica. Quindi, come si ottiene un comportamento atomico su più documenti? È necessario utilizzare un modello di "commissione a due fasi" per ottenere l'atomicità desiderata. Ecco un ottimo esempio dalla documentazione di MongoDB su come implementare questo modello. Il modello di commit in due fasi non è banale da implementare e correggere, quindi assicurati che l'atomicità di scrittura di più documenti sia qualcosa per cui vuoi sparare.

Isolamento

Wikipedia definisce "Isolamento" come segue:"Nei sistemi di database, isolamento è una proprietà che definisce come/quando le modifiche apportate da un'operazione diventano visibili ad altre operazioni simultanee”. Esistono diversi modi per ottenere l'isolamento con le tue operazioni MongoDB, ad esempio:

  1. Comando "findAndModifyOperation()"

    Questo è uno dei modi più semplici per interrogare e modificare documenti esistenti. Il comando può restituire i valori precedenti dei documenti o i nuovi valori aggiornati dei documenti. Puoi anche ordinare i documenti corrispondenti, inserirli e selezionare quali campi devono essere restituiti:

    db.collection.findAndModify( {
                                   query: <document>,
                                   sort: <document>,
                                   remove: <boolean>,
                                   update: <document>,
                                   new: <boolean>,
                                   fields: <document>,
                                   upsert: <boolean>
                               } );
  2. Modello "Aggiorna se corrente"

    Questo modello è specificato nella documentazione di MongoDB. Implica più lavoro manuale ma ti dà più controllo.

  3. Operatore $isolamento

    L'operatore $isolation fornisce un modo per isolare le scritture su più documenti. Tuttavia, l'operatore di isolamento $ non fornisce una garanzia tutto o niente:per raggiungere questo obiettivo dovrai utilizzare alcune delle tecniche di atomicità specificate nella prima sezione. Inoltre, l'operatore di isolamento $ non funziona per gli shard. Questo comando si chiamava “$atomic” – ora è stato correttamente rinominato in “$isolated”.

Concorrenza

MongoDB utilizza i blocchi per impedire a più client di aggiornare la stessa parte di dati contemporaneamente. MongoDB 2.2+ utilizza blocchi di livello "database". Pertanto, quando un'operazione di scrittura blocca il database, tutte le altre operazioni di scrittura sullo stesso database (anche se si trovano in una raccolta separata) vengono bloccate in attesa del blocco. MongoDB utilizza  blocchi "writer greedy" che favoriscono le scritture rispetto alle letture. In 2.2+, alcune operazioni di lunga durata possono cedere i loro blocchi.

Sicurezza dei thread

Non tutte le classi client di MongoDB sono thread-safe:fai riferimento alla documentazione del tuo driver specifico per verificare se le classi che stai utilizzando sono thread-safe. Ad esempio, nel driver Java, la classe MongoClient è thread-safe. Quindi, puoi utilizzare una singola istanza di questa classe in tutti i tuoi thread. Internamente, MongoClient utilizza un pool di connessioni per gestire le connessioni al server MongoDB.

Come sempre, in caso di domande, contattaci all'indirizzo [email protected].