2016-06-29 27 views
15

ho capito che le operazioni Firebase consentono l'aggiornamento atomico di un certo valore, dato il suo valore vecchio e nuovo valoreQuando bisogna utilizzare le transazioni Firebase

Ma dato che Firebase è un database in tempo reale, presumo, si deve utilizzare le transazioni solo con parsimonia e non in 'funzionalità realtime'

ecco un esempio:

  1. capisco che se si sta eseguendo qualche operazione matematica su un valore (aggiungendo 'piace' o equivalente), ha senso utilizzare transazione

  2. Non capisco se abbia senso utilizzare le transazioni nel seguente caso d'uso: Dire che un campo di testo può essere aggiornato da un numero qualsiasi di utenti, e siamo interessati a tutti gli aggiornamenti, poiché si verificano in tempo reale. Firebase consiglia di utilizzare la transazione in questo caso? O è l'ultima 'operazione persistente' che si verifica sul valore, limitata solo a una singola 'operazione permanente' per granularità dell'orario di clock del server Firebase?

Inoltre è garantito che gli eventi verranno consegnati nell'ordine in cui i valori finali sono stati mantenuti?

risposta

14

Ogni volta che si utilizzano transazioni su un database, si sacrifica parte della scalabilità per avere una maggiore garanzia di coerenza dei dati. Le transazioni sul database Firebase non sono diverse, tranne forse che gli sviluppatori tendono ad usare Firebase in situazioni più concomitanti.

Con qualsiasi sistema transazionale: la chiave per mantenere il sistema scalabile è ridurre al minimo il numero di client che contendono di aggiornare gli stessi dati. Nel caso di Firebase, ciò avverrebbe eseguendo la transazione il più basso possibile nell'albero JSON. Cioè un contatore è un esempio di qualcosa che potrebbe funzionare bene in una transazione.

Per i pezzi di dati più grandi, come ad esempio l'esempio di modifica del testo, l'utilizzo di una transazione non si adatta bene. Per tali casi d'uso è meglio trovare un modo per evitare del tutto il conflitto. Molto spesso questo si riduce a memorizzare il delta che ogni utente sta facendo, invece di memorizzare lo stato aggiornato. Un grande esempio di ciò si trova nello Firepad example, che utilizza la trasformazione operativa per creare un editor collaborativo altamente concorrente in cima al database Firebase.

+0

Sì, non intendo utilizzare le transazioni. ecco un esempio. Assumi un sistema "Comment". Posso andare avanti e memorizzare tutti i commenti in un nodo radice "commenti" con un tasto push univoco + alcuni attributi. Questa radice può diventare grande e se mi piacerebbe ottenere una lista ordinata, invierei una query con qualche parametro sort (su timestamp). Se ho un altro nodo: CommentLatest, che memorizza il tasto push univoco dell'ultimo commento. Quindi ogni cliente esegue due scritture: una scrittura nell'albero "Comment" con un tasto push univoco e un aggiornamento all'albero commentlatest con l'ultimo = tasto push univoco che ha appena usato. Questa scala? – wrecktangle

+0

(continua) ed esiste una possibilità di danneggiamento nel nodo CommentLatest se ci sono più client che aggiornano il nodo commentLatest? – wrecktangle

+1

Se si è preoccupati per la contestazione dell'aggiornamento del valore 'latestCommentId', è possibile che l'ottimizzazione venga anticipata. La sovrascrittura con una data precedente può essere evitata includendo il timestamp come valore di 'latestCommentId' e quindi il rifiuto del timestamp è più vecchio di quello che è attualmente presente. Ma notiamo che siamo passati da una domanda incredibilmente ampia a un caso d'uso molto dettagliato qui. Prima potresti dedicare un po 'più di tempo a lavorare con le transazioni Firebase e poi fare una domanda più concreta con codice e regole di sicurezza. –

Problemi correlati