sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Emulación de transacciones CouchDB/Couchbase/MongoDB?

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:-

  1. Obtenga el documento.
  2. Envíelo para actualizar usando la propiedad _rev.
  3. Si la actualización se realiza correctamente, habrá actualizado la última _rev del documento
  4. 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:

  1. Insertar un nuevo archivo
  2. 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:-

  1. Leíste el documento que se va a actualizar.
  2. Cambias algunos campos.
  3. Mientras tanto, otra solicitud ya ha cambiado el documento original. Esto significa que el documento ahora tiene un nuevo _rev
  4. Pero solicitas a couchdb que actualice el documento con un _rev eso es stale que leyó en el paso 1.
  5. Couchdb generará una excepción.
  6. 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.

Nota:

Como señaló Daniel el _rev las reglas no se aplican a las actualizaciones masivas.