2011-05-20 34 views
8

Me doy cuenta de que MongoDB es una solución NoSQL, pero me preguntaba si tenía algún tipo de nivel de aislamiento de transacciones a nivel de serialización equivalente.Serialización "nivel de aislamiento" en MongoDB, o el problema de actualización perdida

Si no, ¿cómo resolverías el problema de actualización perdida en MongoDB?

Quiero mantener el historial de revisión de algunos datos en Mongo y cada revisión tiene que apuntar a la anterior. ¿Cómo puedo asegurarme de que no existe más de una última revisión para mis datos y, por otro lado, que no se pierde ninguna revisión debido a actualizaciones concurrentes?

** Editar **

Vaya, RTFM, sí es posible: http://www.mongodb.org/display/DOCS/Atomic+Operations

No estoy seguro si debe cerrar la cuestión ya que el conocimiento podría ser relevante para otras personas ..

+0

simplemente más contexto: se ejecuta en Linux y no está interesado en soluciones que usen el bloqueo de archivos .. –

+0

p. CouchDB tiene una especie de bloqueos optimistas en los que si una actualización utiliza una ID de reválida obsoleta, se rechaza. Eso resuelve el problema. No estoy seguro si Mongo tiene algo similar. –

Respuesta

6

Sí, esto es posible, siempre y cuando mantenga el historial en un solo documento. MongoDB admite atomic updates dentro del alcance de un documento, pero no en varios documentos en una colección.

Por lo tanto, se puede incrustar la historia en una matriz, utilizando un esquema algo como esto:

{ 
    _id: 12345, 
    value: "Apple", 
    history: 
    [ 
     { revisionid: 2, value: "Orange" }, 
     { revisionid: 1, value: "Pear" } 
    ] 
} 

Por ejemplo, se puede insertar un nuevo documento:

db.things.insert({ _id: 123, value: "Apple" }) 

Entonces actualizarlo en una operación atómica:

db.things.update({ _id: 123 }, 
    { 
     $set: { value: "Orange" }, 
     $push : { history : { revisionid: 1, value: "Apple" } } 
    } 
) 
Cuestiones relacionadas