Couchdb es transaccional por defecto. Cada documento en couchdb contiene un _rev
llave. Todas las actualizaciones de un documento se realizan en este _rev
clave:-
- Obtenga el documento.
- Envíelo para actualizar usando la propiedad _rev.
- Si la actualización se realiza correctamente, habrá actualizado la última _rev del documento
- Si la actualización falla, el documento no era reciente. Repita los pasos 1 a 3.
Consulte esta respuesta de MrKurt para una explicación más detallada.
Las couchdb recetas tiene un ejemplo bancario que muestra cómo se realizan las transacciones en couchdb.
Y también está esta transferencias bancarias atómicas artículo que ilustra transacciones en couchdb.
De todos modos, el tema común en todos estos enlaces es que si sigues el patrón de couchdb de actualizar contra un _rev
no puede tener un estado inconsistente en su base de datos.
Todos los documentos de couchdb son únicos desde el _id
los campos de dos documentos no pueden ser iguales. Consulte el ver libro de cocina
Editar según el comentario
Podría usar documentos separados en este caso. Inserta un documento, espera la respuesta de éxito. Luego agregue otro documento como
{_id:'some_id','count':1}
Con esto, puede configurar una vista reducida del mapa que simplemente cuenta los resultados de estos documentos y tiene un contador de actualización. Todo lo que está haciendo es, en lugar de actualizar un solo documento para las actualizaciones, está insertando un nuevo documento para reflejar una inserción exitosa.
De acuerdo, ya describí cómo puede hacer actualizaciones en documentos separados, pero incluso al actualizar un solo documento puede evitar la inconsistencia si:
- Insertar un nuevo archivo
- Cuando couchdb da un mensaje de éxito -> intenta actualizar el contador.
¿Por qué funciona esto?
Esto funciona porque cuando intentas actualizar el update document
debe proporcionar un _rev
cuerda. Puedes pensar en _rev
como un estado local para su documento. Considere este escenario:-
- Leíste el documento que se va a actualizar.
- Cambias algunos campos.
- Mientras tanto, otra solicitud ya ha cambiado el documento original. Esto significa que el documento ahora tiene un nuevo
_rev
- Pero solicitas a couchdb que actualice el documento con un
_rev
eso esstale
que leyó en el paso 1. - Couchdb generará una excepción.
- Lee el documento de nuevo y obtén el último
_rev
e intente actualizarlo.
Entonces, si hace esto, siempre tendrá que actualizar con la última revisión del documento. Espero que esto aclare un poco las cosas.
Como señaló Daniel el _rev
las reglas no se aplican a las actualizaciones masivas.