Le transazioni funzionano come SimpleDB di Amazon o un cluster di database semplificato. Vale a dire, sono "alla fine coerenti" piuttosto che garantiti coerenti.
Pertanto, quando si utilizzano le transazioni, la funzione di elaborazione può essere richiamata più volte con un valore locale (in alcuni casi nullo se non è mai stato recuperato) e quindi di nuovo con il valore sincronizzato (qualunque cosa si trovi sul server).
Esempio:
pathRef.transaction(function(curValue) {
// this part is eventually consistent and may be called several times
}, function(error, committed, ss) {
// this part is guaranteed consistent and will match the final value set
});
Questa è davvero la mentalità con cui si deve affrontare delle transazioni in ogni modo. Dovresti sempre aspettarti più chiamate, poiché la prima transazione potrebbe scontrarsi con un'altra modifica e essere respinta. Non è possibile utilizzare il metodo di elaborazione di una transazione per recuperare il valore del server (sebbene sia possibile leggerlo dal callback di successo).
Prevenire l'evento innescato localmente
Quando la transazione avviene, un evento locale viene attivato prima che raggiunga il server per la compensazione di latenza. Se la transazione fallisce, l'evento locale verrà ripristinato (viene attivato un evento di modifica o rimozione).
È possibile utilizzare la proprietà on transactionsapplyLocally
per sovrascrivere questo comportamento, che rallenta i risultati locali ma garantisce che solo il valore del server venga attivato localmente.
pathRef.transaction(function(curValue) {
// this is still called multiple times
}, function(error, committed, ss) {
// this part is guaranteed consistent and will match the final value set
},
// by providing a third argument of `true`, no local event
// is generated with the locally cached value.
true);
Grazie, ho usato la transazione quasi 3 giorni dopo i dati inseriti. Quindi tu dici di usare la transazione per prima cosa, dobbiamo controllare quella posizione se esiste o meno un valore? – Ashok
"Eventually persistent" non ha nulla a che fare con la lunghezza che è stata sul server, solo la lunghezza che è stata sul client - non è sul client finché non lo chiedi. Non è necessario necessariamente verificare che esista un valore, accetta solo che la funzione possa essere chiamata più volte e che venga "eventualmente" chiamata con il valore del server. – Kato
@Kato Prendo atto che la transazione sarebbe una cosa negativa per un server Node da utilizzare per decrementare il saldo di un utente?Come se un altro server di nodo effettuasse una scrittura in anticipo, allora voglio scrivere la stessa cosa (quindi impostare sarebbe meglio?) –