Je suis intéressant dans la modélisation des relations entre les documents dans CouchDB. Disons que j'ai trois documents A, B et C. Ces documents peuvent se référer les uns aux autres, mais il y a une contrainte d'application que la dépendance cyclique ne doit pas se produire.Comment éviter les dépendances cycliques entre les documents dans CouchDB
permet de prendre un exemple (-> est un marqueur de dépendance):
A -> B
C
deux clients (C1, C2) essayer modification simultanée:
C1 = B -> C
C2 = C -> A
Si C1 et C2 sont réussis, il y aura un cycle. La question est de savoir comment l'éviter? Je pensais à ce sujet et il me semble que j'ai besoin d'une sorte de verrou à grain grossier pour les documents et la mise à jour atomique en vrac. Le problème est la mise à jour en masse atomique. CouchDB prend en charge la mise à jour en bloc, mais sans restauration en cas de conflit de version. Ce que cela signifie:
Supposons que nous ayons le document V. Ce document représente la version globale (verrou grossier) et contient la version des documents connexes (A, B, C) pour une révision de document donnée.
V {
_rev: 1,
versions: [[A,1],[B,1],[C,1]]
}
C1 et C2 travail en même temps:
C1 = get V
C2 = get V
C1 = obtenir A.1, B.1, C1
C2 = obtenir A.1, B.1, C1
C1 = faire la vérification des dépendances (tout est OK)
C2 = faire la vérification des dépendances (tout est OK)
C1 = mise à jour V en ce qui concerne à destinés B-> dépendance C {versions: [ [A, 1], [B 2], [C, 2]]} (tout est OK)
C1 = mise à jour B
C2 = essayant en ce qui concerne la mise à jour V à l'intention C-> A dépendance {versions: [[A, 2], [B, 1], [C, 2]]} (cette étape échouera, à cause de CouchDB verrouillage optimiste)
Tout va bien et bien jusqu'à ce que C1 se bloque entre l'étape 7. et 8. Maintenant l'insertion/mise à jour en vrac arrivant à la scène.
7.) C1 = mise à jour V en ce qui concerne à B- destiné> dépendance de C {versions: [[A, 1], [B 2], [C, 2]]} (tout est OK) et mise à jour B
Quelle belle solution, malheureusement cela ne marche pas du tout, à cause de la sémantique d'insertion/mise à jour en vrac dans CouchDB http://wiki.apache.org/couchdb/HTTP_Bulk_Document_API#Transactional_Semantics_with_Bulk_Updates. L'insertion/mise à jour en masse n'est pas une opération atomique.
Y at-il une solution de contournement pour cela? Puis-je le contourner d'une manière ou d'une autre? Ai-je manqué quelque chose d'important?