Couchdb est transactionnel par défaut. Chaque document dans couchdb contient un _rev
clé. Toutes les mises à jour d'un document sont effectuées par rapport à ce _rev
clé :-
- Obtenez le document.
- Envoyez-le pour mise à jour à l'aide de la propriété _rev.
- Si la mise à jour réussit, vous avez mis à jour la dernière _rev du document
- Si la mise à jour échoue, le document n'est pas récent. Répétez les étapes 1 à 3.
Découvrez cette réponse de MrKurt pour une explication plus détaillée.
Les recettes de couchdb a un exemple bancaire qui montre comment les transactions sont effectuées dans couchdb.
Et il y a aussi ce les virements bancaires atomiques article qui illustre les transactions dans couchdb.
Quoi qu'il en soit, le thème commun à tous ces liens est que si vous suivez le modèle couchdb de mise à jour par rapport à un _rev
vous ne pouvez pas avoir un état incohérent dans votre base de données.
Tous les documents couchdb sont uniques depuis le _id
les champs de deux documents ne peuvent pas être identiques. Consultez le voir le livre de recettes
Modification basée sur un commentaire
Vous pouvez utiliser des documents séparés dans ce cas. Vous insérez un document, attendez la réponse de succès. Ajoutez ensuite un autre document comme
{_id:'some_id','count':1}
Avec cela, vous pouvez configurer une vue réduite de la carte qui compte simplement les résultats de ces documents et vous avez un compteur de mise à jour. Tout ce que vous faites est au lieu de mettre à jour un seul document pour les mises à jour, vous insérez un nouveau document pour refléter une insertion réussie.
D'accord, j'ai déjà décrit comment vous pouvez effectuer des mises à jour sur des documents séparés, mais même lors de la mise à jour d'un seul document, vous pouvez éviter les incohérences si vous :
- Insérer un nouveau fichier
- Lorsque couchdb donne un message de réussite -> essayez de mettre à jour le compteur.
Pourquoi cela fonctionne ?
Cela fonctionne parce que lorsque vous essayez de mettre à jour le update document
vous devez fournir un _rev
chaîne de caractères. Vous pouvez penser à _rev
comme état local pour votre document. Considérez ce scénario :-
- Vous avez lu le document qui doit être mis à jour.
- Vous modifiez certains champs.
- Entre-temps, une autre demande a déjà modifié le document d'origine. Cela signifie que le document a maintenant un nouveau
_rev
- Mais vous demandez à couchdb de mettre à jour le document avec un
_rev
qui eststale
que vous avez lu à l'étape 1. - Couchdb va générer une exception.
- Vous relisez le document pour obtenir le dernier
_rev
et essayez de le mettre à jour.
Donc, si vous faites cela, vous devrez toujours mettre à jour la dernière révision du document. J'espère que cela rend les choses un peu plus claires.
Remarque :
Comme l'a souligné Daniel le _rev
les règles ne s'appliquent pas aux mises à jour groupées.