Les transactions fonctionnent à la manière de SimpleDB d'Amazon ou d'un cluster de base de données fragmenté. C'est-à-dire qu'ils sont "finalement cohérents" plutôt que garantis cohérents. Ainsi, lorsque vous utilisez des transactions, la fonction de traitement peut être appelée plusieurs fois avec une valeur locale (dans certains cas nulle si elle n'a jamais été récupérée) et de nouveau avec la valeur synchronisée (tout ce qui est sur le serveur).
Exemple:
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
});
C'est vraiment l'état d'esprit avec lequel vous devez aborder la transaction de toute façon. Vous devez toujours attendre plusieurs appels, car la première transaction peut entrer en conflit avec une autre modification et être rejetée. Vous ne pouvez pas utiliser la méthode de traitement d'une transaction pour extraire la valeur du serveur (bien que vous puissiez la lire hors du rappel de succès).
empêcher l'événement déclenché localement
Lorsque la transaction se produit, un événement local est déclenché avant d'atteindre le serveur de compensation de la latence. Si la transaction échoue, l'événement local sera annulé (un événement de modification ou de suppression est déclenché).
Vous pouvez utiliser la propriété applyLocally
on transactions pour remplacer ce comportement, ce qui rend les résultats locaux plus lents mais garantit que seule la valeur du serveur est déclenchée localement.
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);
Merci, j'ai utilisé la transaction presque 3 jours après l'insertion des données. Donc, vous dites d'utiliser la transaction d'abord, nous devons vérifier cet emplacement si une valeur existe ou non? – Ashok
"Éventuellement persistant" n'a rien à voir avec la longueur sur le serveur, juste la longueur qu'il a été sur le client - ce n'est pas sur le client jusqu'à ce que vous le demandiez. Vous n'avez pas forcément besoin de vérifier qu'une valeur existe, acceptez simplement que la fonction peut être appelée plusieurs fois et sera "éventuellement" appelée avec la valeur du serveur. – Kato
@Kato Je suppose que cette transaction serait une mauvaise chose pour un serveur Node à utiliser pour décrémenter le solde d'un utilisateur?Comme si un autre serveur de noeud faisait une écriture à l'avance, alors je veux qu'il écrive la même chose (ainsi set serait mieux?) –