Question

Je trouve des transactions ( https://www.firebase.com/docs/transactions.html ) àSoyez une façon cool de manipuler la concurrence, mais il semble qu'ils ne peuvent être effectués que des clients.

La façon dont nous utilisons Firebase est principalement en écrivant des données de nos serveurs et en les observant sur les clients.Existe-t-il un moyen d'obtenir un modèle de concurrence optimiste lors de l'écriture de données via API de repos?

merci!

Était-ce utile?

La solution

Vous pouvez utiliser un compteur de mise à jour pour effectuer des opérations d'écriture d'écriture de manière similaire aux transactions.(Je vais utiliser un pseudo-code ci-dessous; désolé pour cela, mais je ne voulais pas écrire une API de repos complet pour un exemple.)

Par exemple, si j'ai un objet comme celui-ci:

{
   total: 100,
   update_counter: 0
}

et une règle d'écriture comme celle-ci:

{
   ".write": "newData.hasChild('update_counter')",
   "update_counter": {
      ".validate": "newData.val() === data.val()+1"
   }
}

Je pourrais désormais empêcher les modifications simultanées en passant simplement dans l'update_counter à chaque opération.Par exemple:

var url = 'https://<INSTANCE>.firebaseio.com/path/to/data.json';
addToTotal(url, 25, function(data) {
   console.log('new total is '+data.total);
});

function addToTotal(url, amount, next) {
   getCurrentValue(url, function(in) {
      var data = { total: in.total+amount, update_counter: in.update_counter+1 };
      setCurrentValue(ref, data, next, addToTotal.bind(null, ref, amount, next));
   });
}

function getCurrentValue(url, next) {
   // var data = (results of GET request to the URL) 
   next( data );
}

function setCurrentValue(url, data, next, retryMethod) {
   // set the data with a PUT request to the URL
   // if the PUT fails with 403 (permission denied) then
   // we assume there was a concurrent edit and we need
   // to try our pseudo-transaction again
   // we have to make some assumptions that permission_denied does not
   // occur for any other reasons, so we might want some extra checking, fallbacks,
   // or a max number of retries here
   // var statusCode = (server's response code to PUT request)
   if( statusCode === 403 ) {
       retryMethod();
   }
   else {
       next(data);
   }
}

Autres conseils

FYI, la base de données Realtime Firebase prend officiellement la prise en charge de ce moment.

lire le blog et le Docs pour plus d'informations.

Consultez le projet Firebase-Transactions: https://github.com/vacumlabs/firebase-Transactions

Je crois, cela peut être assez pratique pour votre cas, surtout si vous faites beaucoup d'écritures du serveur.

(Disclaimer: Je suis l'un des auteurs)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top