2014-11-20 10 views
13

Sono nuovo di MongoDB. Ho letto che MongoDB does not support multi-document transactions qui http://docs.mongodb.org/manual/faq/fundamentals/.Supporto per le transazioni in MongoDB

Se voglio salvare i dati in due raccolte (A e B) atomicamente, quindi non posso farlo usando MongoDB cioè se il salvataggio fallisce in caso di B, ancora A avrà i dati. Non è un grande svantaggio?

Tuttavia, le persone utilizzano MongoDB anziché RDBMS. Perché?

+1

Oltre ad essere troppo ampio e soggettivo, la risposta predefinita: perché vogliamo e si adatta il nostro scenario? Pensaci anche: in un'app per le transazioni senza soldi/risorse (come il 90% delle app disponibili) quante righe si affidano l'una sull'altra? Invece è possibile implementare qualcosa noto come consistenza finale per questo, per cui lo rende on-demand in pezzi. Ovviamente, è molto più semplice e veloce ridimensionare anche – Sammaye

+0

@ Sammaye. Riguarda il tuo caso d'uso. NoSQL è più utilizzato per la memorizzazione di dati grezzi che cresce enorme e ricava un valore aziendale da esso. Venendo al supporto delle transazioni non lo supporta. questo potrebbe non essere sicuro se è disponibile sul mercato per l'uso di http: //www.tokutek.com/2013/04/mongodb-multi-statement-transactions-yes-we-can/ – Ninad

risposta

4

MongoDB non supporta le transazioni, ma il salvataggio di un documento è atomico.

Quindi, è meglio progettare lo schema del database in modo tale che tutti i dati necessari per essere salvati atomicamente siano collocati in un unico documento.

+0

Se si dispone di due conti bancari che devono trasferire denaro, non sarebbe una buona pratica salvare entrambi gli account in un documento, oppure se si autorizzano le transazioni tra tutti gli account, tutti in un documento – Sammaye

+0

@Sammaye I può fornire un approccio bitcoin come esempio. Quindi, una persona deve trasferire parte del suo equilibrio ad un'altra persona. In questo caso verrà creato un solo documento: una "transazione" (è solo il nome della raccolta, non è una transazione in termini di SQL). L'account non ha campo con il suo saldo, il saldo viene sempre conteggiato secondo l'elenco delle transazioni. – stalk

+0

Quindi avresti una transazione che viene letta da entrambi i conti bancari? Sembra molto ... insicuro, usare le transazioni come conteggio per l'equilibrio è già abbastanza buono – Sammaye

9

MongoDB non supporta transazioni multi-documento.

Tuttavia, MongoDB fornisce operazioni atomiche su un singolo documento. Spesso queste operazioni atomiche a livello di documento sono sufficienti per risolvere problemi che richiederebbero transazioni ACID in un database relazionale.

Ad esempio, in MongoDB, è possibile incorporare i dati correlati in matrici annidate o documenti nidificati in un singolo documento e aggiornare l'intero documento in una singola operazione atomica. I database relazionali potrebbero rappresentare lo stesso tipo di dati con più tabelle e righe, il che richiederebbe il supporto delle transazioni per aggiornare i dati atomicamente.

3

MongoDB non supporta le transazioni come nel DB relazionale. ACID postula nelle transazioni è una funzionalità diversa completa fornita dai motori di memorizzazione in MySQL

Alcune delle caratteristiche del motore InnoDB in MySQL:

  • Crash Recovery
  • doppio buffer di scrittura
  • Impostazioni di commit automatico
  • livello di isolamento

Questo è ciò che comunità MongoDB ha da dire:

MongoDB non ha il supporto per il bloccaggio tradizionale o transazioni complesse con rollback.

MongoDB mira a essere leggero, veloce e prevedibile nelle sue prestazioni. Mantenendo il supporto delle transazioni estremamente semplice, MongoDB è in grado di fornire prestazioni più elevate, in particolare per i sistemi partizionati o replicati con numerosi processi del server di database.

Lo scopo di una transazione è assicurarsi che l'intero database rimanga coerente mentre si verificano più operazioni.

Ma al contrario della maggior parte dei database relazionali, MongoDB non è progettato per essere eseguito su un singolo host. È progettato per essere configurato come un cluster di più frammenti in cui ogni frammento è una serie di repliche di più server (opzionalmente in diverse posizioni geografiche).

Ma se siete ancora alla ricerca di modo per rendere le operazioni possibili:

  • Provare a utilizzare a livello di documento atomicità fornito da Mongo
  • commit a due fasi in Mongo fornisce semplice meccanismo di transazione per operazioni di base
  • mongomvcc è costruito sulla parte superiore di mongo e supporta anche la transazione come si dice
  • ibrida di MySQL e Mongo
0

Questa domanda è piuttosto vecchio, ma per chi si imbatte in questa pagina, è possibile utilizzare fawn. È un pacchetto npm che risolve questo problema esatto. Divulgazione: l'ho scritto

Supponiamo che tu abbia due conti bancari, uno appartiene a John Smith e l'altro appartiene a Broke Individual. Vorresti trasferire $ 20 da John Smith a Broke Individual. Supponendo che tutto Cognome e coppie nome sono unici, questo potrebbe essere simile:

var Fawn = require("fawn"); 
var task = Fawn.Task() 

//assuming "Accounts" is the Accounts collection 
task.update("Accounts", {firstName: "John", lastName: "Smith"}, {$inc: {balance: -20}}) 
    .update("Accounts", {firstName: "Broke", lastName: "Individual"}, {$inc: {balance: 20}}) 
    .run() 
    .then(function(){ 
    //update is complete 
    }) 
    .catch(function(err){ 
    // Everything has been rolled back. 

    //log the error which caused the failure 
    console.log(err); 
    }); 

Caveat: compiti non sono attualmente isolati (lavorando su questo) così, tecnicamente, è possibile per due compiti per recuperare e modificare il stesso documento solo perché è così che funziona MongoDB.

E 'davvero solo un'implementazione generica del commit a due fasi ad esempio sul sito di tutorial: https://docs.mongodb.com/manual/tutorial/perform-two-phase-commits/

+2

Mentre hai divulgato la tua affiliazione con i link, rendendola non spam, è ancora un __link- solo answer__, che in genere vengono cancellati. È meglio sintetizzare i punti chiave nella risposta e fornire il link per riferimento. –

+0

Grazie per il puntatore. Ho corretto che –

+0

@JohnnyHK ho aggiunto quelle informazioni –