{"id":4832,"date":"2018-03-19T07:00:32","date_gmt":"2018-03-19T14:00:32","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4832"},"modified":"2025-06-13T23:43:12","modified_gmt":"2025-06-14T06:43:12","slug":"document-conflicts-couchbase-mobile","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/document-conflicts-couchbase-mobile\/","title":{"rendered":"Conflictos y resoluci\u00f3n de documentos en Couchbase Mobile 2.0"},"content":{"rendered":"<p>Los conflictos entre documentos pueden ocurrir en entornos distribuidos que soportan la sincronizaci\u00f3n de datos, en los que un documento puede ser actualizado simult\u00e1neamente por uno o m\u00e1s escritores. Esto es especialmente com\u00fan en entornos m\u00f3viles, donde las conexiones de red poco fiables pueden provocar que los cambios simult\u00e1neos de varios dispositivos no se sincronicen a tiempo.<\/p>\n<p>Tambi\u00e9n puede ocurrir en el lado del cliente, por ejemplo, si un documento se est\u00e1 actualizando localmente mientras los cambios en el documento se est\u00e1n bajando al cliente desde un servidor remoto. De ah\u00ed la necesidad de resolver estos conflictos entre documentos. \u00a0<a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/2.0\/whatsnew.html\">Couchbase M\u00f3vil 2.0<\/a>presenta <em>\"Resoluci\u00f3n autom\u00e1tica de conflictos\"<\/em> o un\u00a0<em>\"Sin conflictos\"<\/em> en el que los conflictos se gestionan autom\u00e1ticamente y no hay revisiones de documentos en conflicto en la base de datos de Couchbase.<\/p>\n<p>Como desarrollador de aplicaciones, es probable que nunca tengas que hacer nada espec\u00edfico en la aplicaci\u00f3n para resolver conflictos, ya que el sistema de resoluci\u00f3n de conflictos por defecto se encargar\u00e1 autom\u00e1ticamente de ello. Sin embargo, si lo necesitas, tienes la opci\u00f3n de ser notificado de los conflictos y tomar las medidas oportunas. Este post discutir\u00e1 los fundamentos de c\u00f3mo los conflictos de documentos son manejados autom\u00e1ticamente en Couchbase Mobile 2.0 usando el \"<em>resoluci\u00f3n autom\u00e1tica de conflictos<\/em>\" o \"<em>sin conflictos <\/em>\".<\/p>\n<p><!--more--><\/p>\n<p>&nbsp;<\/p>\n<h2 id=\"assumptions\">Supuestos<\/h2>\n<p>Este post asume que usted est\u00e1 familiarizado con la arquitectura de la pila de Couchbase Mobile que incluye el <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/couchbase-lite\/index.html\">Couchbase Lite<\/a> base de datos integrada para sus clientes m\u00f3viles, el <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/sync-gateway\/index.html\">Pasarela de sincronizaci\u00f3n<\/a> y <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/introduction\/intro.html\">Servidor Couchbase<\/a>. Si eres nuevo en la plataforma, te recomiendo que empieces por estos <a href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/mobile\/\">recursos<\/a>.<\/p>\n<h2 id=\"background\">Fondo<\/h2>\n<p>Si a\u00fan no lo ha hecho, le recomendamos que lea esto antes. <a href=\"https:\/\/www.couchbase.com\/blog\/es\/conflict-resolution-couchbase-mobile\/\">desmitificar la resoluci\u00f3n de conflictos post<\/a> que discute los fundamentos de c\u00f3mo se maneja la resoluci\u00f3n de conflictos en modo \"no libre de conflictos\" en Couchbase Mobile, incluyendo una visi\u00f3n general del sistema de Control de Concurrencia Multi-Versi\u00f3n (MVCC).<\/p>\n<h3 id=\"documentrevisiontree\">\u00c1rbol de revisi\u00f3n de documentos<\/h3>\n<p>Para entender el proceso de resoluci\u00f3n de conflictos, tendr\u00edas que tener una comprensi\u00f3n b\u00e1sica de c\u00f3mo se almacenan los documentos. En Couchbase Mobile, a cada documento se le asigna un \u00fanico ID de revisi\u00f3n generado por el sistema o <em>revID<\/em>. Este identificador se a\u00f1ade al identificador del documento, que es el mismo para todas las revisiones. Cada cambio en un documento, ya sea una modificaci\u00f3n o una eliminaci\u00f3n, se trata como una nueva revisi\u00f3n del documento y, por tanto, se le asigna un nuevo ID de revisi\u00f3n.<\/p>\n<p>Adem\u00e1s, cada revisi\u00f3n de documento tiene un \"<em>generationID<\/em>\"asociada a ella. La primera vez que se crea un documento, se crea una revisi\u00f3n con un \"<em>generationID<\/em>\" de 1. Cada actualizaci\u00f3n de revisi\u00f3n posterior incrementar\u00e1 este n\u00famero.<\/p>\n<p>Cada vez que se va a realizar un cambio (edici\u00f3n o eliminaci\u00f3n) en un documento existente, el autor debe incluir el ID de revisi\u00f3n de la revisi\u00f3n actual del documento que se est\u00e1 actualizando. Se crea una nueva revisi\u00f3n para el cambio y se a\u00f1ade como nodo hijo a la revisi\u00f3n actual que se estaba actualizando, dando lugar a un \u00c1rbol de Revisi\u00f3n para el documento.<\/p>\n<p>NOTA <em>\"revID\"<\/em> debe ser tratado por la aplicaci\u00f3n como un objeto opaco y la aplicaci\u00f3n no debe intentar generar el objeto <em>\"revID\"<\/em>.<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/revision-tree-latest.png\" alt=\"\" \/><\/figure>\n<h2 id=\"howdocumentconflictsoccur\">C\u00f3mo se producen los conflictos de documentos<\/h2>\n<p>A alto nivel, un conflicto se produce cuando varios redactores realizan cambios en la misma revisi\u00f3n principal de un documento.<\/p>\n<h3 id=\"conflictatcouchbaselite\">Conflictos en Couchbase Lite<\/h3>\n<p>La siguiente ilustraci\u00f3n describe un escenario en el que una aplicaci\u00f3n est\u00e1 actualizando una revisi\u00f3n de documento en memoria mientras que la misma revisi\u00f3n se est\u00e1 actualizando como resultado de una replicaci\u00f3n pull.<br \/>\n<img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/cbl_conflict-1.png\" alt=\"\" \/><\/p>\n<h3 id=\"conflictatsyncgateway\">Conflictos en la pasarela de sincronizaci\u00f3n<\/h3>\n<p>La siguiente ilustraci\u00f3n describe una situaci\u00f3n en la que dos clientes introducen cambios en la misma revisi\u00f3n del documento.<br \/>\n<img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/conflict-basics-1.png\" alt=\"\" \/><\/p>\n<h2 id=\"conflictfreemodeincouchbasemobile2.0\">Resoluci\u00f3n de conflictos en Couchbase Mobile 2.0<\/h2>\n<p>En <em>\"Sin conflictos<\/em> el Sync Gateway rechaza todas las actualizaciones conflictivas. Los conflictos se resuelven autom\u00e1ticamente en el momento en que se crea, actualiza o elimina el documento.<br \/>\nEsto implica que no hay documentos conflictivos almacenados en la base de datos y es efectivamente, \"<em>Sin conflictos<\/em>\". Vamos a ver c\u00f3mo funciona.<\/p>\n<h3 id=\"automaticconflictresolutionincouchbaselite2.0\">Resoluci\u00f3n autom\u00e1tica de conflictos en Couchbase Lite 2.0<\/h3>\n<p>Cada documento en Couchbase Lite 2.0 est\u00e1 asociado a un <em>\"resoluci\u00f3n de conflictos\"<\/em> que se ejecuta si se produce un conflicto cuando se intenta <code>guardar<\/code> o <code>borrar<\/code> un documento. La funci\u00f3n de resoluci\u00f3n de conflictos elige un \"<em>ganador<\/em>\" entre las revisiones en conflicto y este ganador se a\u00f1ade como hijo al \u00e1rbol de revisiones del documento.<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/01\/conflict-resolver-basics.png\" alt=\"\" \/><\/figure>\n<p>Hay dos pol\u00edticas de control de concurrencia soportadas por Couchbase Lite.<\/p>\n<h4 id=\"concurrencycontrolpolicy\">Pol\u00edtica de control de concurrencia<\/h4>\n<h5 id=\"lastwritealwayswinsdefault:\"><strong>La \u00faltima escritura siempre gana (por defecto):<\/strong><\/h5>\n<p>Esta es tambi\u00e9n la pol\u00edtica de resoluci\u00f3n de conflictos por defecto. En este caso, siempre gana la \u00faltima actualizaci\u00f3n de la base de datos.<\/p>\n<p>Cuando llame <code>guardarDocumento<\/code> sin el argumento Control de concurrencia, \u00e9sta es la pol\u00edtica que se aplica por defecto.<\/p>\n<p>Este es un ejemplo de la llamada en swift.<\/p>\n<pre><code class=\"swift\"> let savedDocument = try saveDocument(docToSave)<\/code><\/pre>\n<p>Los siguientes ejemplos deber\u00edan aclarar las implicaciones de esta pol\u00edtica<\/p>\n<ul>\n<li>\u00a0Por ejemplo, nuestra petici\u00f3n de guardar\/actualizar tiene \u00e9xito aunque el documento en la base de datos haya sido actualizado desde la \u00faltima vez que le\u00edmos el documento. El documento en la base de datos podr\u00eda haber sido actualizado por un hilo diferente en la aplicaci\u00f3n como resultado de alg\u00fan desencadenante externo, como una replicaci\u00f3n pull o una obtenci\u00f3n de datos de un servidor remoto. La implicaci\u00f3n es que cualquier cambio realizado en el documento entre el momento en que lo le\u00edmos y lo actualizamos se sobrescribir\u00eda.<\/li>\n<\/ul>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/conflict-free-last-write-wins.png\" alt=\"\" \/><\/figure>\n<ul>\n<li>Como se muestra a continuaci\u00f3n, nuestra solicitud de guardar \/ actualizar tiene \u00e9xito a pesar de que el documento en la base de datos se ha eliminado desde la \u00faltima vez que le\u00edmos el documento. El documento en la base de datos podr\u00eda haber sido actualizado por un hilo diferente en la aplicaci\u00f3n como resultado de alg\u00fan desencadenante externo, como una replicaci\u00f3n pull o una obtenci\u00f3n de datos de un servidor remoto. La implicaci\u00f3n es que un documento borrado podr\u00eda ser resucitado como resultado del guardado.<\/li>\n<\/ul>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/conflict-free-last-write-wins-on-delete-1.png\" alt=\"\" \/><\/figure>\n<h5 id=\"failonconflict\"><strong>Fracasar en el conflicto<\/strong><\/h5>\n<p>Aunque anticipamos que la pol\u00edtica de control de concurrencia por defecto de \"la \u00faltima escritura gana\" deber\u00eda funcionar para la mayor\u00eda de los casos, puede anular el comportamiento por defecto especificando que desea ser notificado en caso de conflicto al guardar el documento. Esto puede hacerse incluyendo la opci\u00f3n <em>ControlConcurrente<\/em> como parte de la solicitud de almacenamiento.<\/p>\n<p>Un valor de retorno <code>falso<\/code> con un <em>Control de concurrencia <\/em>pol\u00edtica <code>failOnConflict<\/code> indica que el documento guardado fall\u00f3 como resultado de un conflicto. A continuaci\u00f3n examinaremos c\u00f3mo puede gestionar los errores de conflicto.<\/p>\n<h4 id=\"handlingfailonconflicts\">Gesti\u00f3n de fallos en los conflictos<\/h4>\n<p>La forma de manejar los conflictos depende de la sem\u00e1ntica de la aplicaci\u00f3n. Aqu\u00ed hay ejemplos de c\u00f3mo se puede manejar en swift (que puede ser f\u00e1cilmente mapeado a otros lenguajes)<\/p>\n<ul>\n<li><strong>Opci\u00f3n 1:<\/strong>\u00a0<strong>Fusionar las versiones en conflicto del documento y guardar<\/strong><\/li>\n<\/ul>\n<pre><code class=\"swift\">do {\r\n    var success = false\r\n    repeat {\r\n        if try db.saveDocument(docToSave, concurrencyControl: .failOnConflict) {\r\n            \/\/ save was a success. docToSave is the new saved revision. Proceed as usual\r\n            success = true\r\n        }\r\n        else {\r\n            \/\/ Failure on save with failOnConflict mode\r\n            \/\/ Handle conflict appropriately\r\n            \/\/ First, fetch the current saved version of doc\r\n            if let currDoc = db.document(withID: docToSave.id) {\r\n                \/\/ Option 1 : Merge the contents of doc1b and currDoc\r\n                docToSave = mergeDocument(newDoc: docToSave, currentDoc: currDoc)\r\n            }\r\n            else {\r\n                \/\/ Doc was deleted. Handle appropriately\r\n            }\r\n        }\r\n        \r\n    } while (!success)\r\n}\r\ncatch {\r\n    print(\"Some other error in saving \\(error)\")\r\n}<\/code><\/pre>\n<p>Este es un ejemplo de c\u00f3mo fusionar las revisiones en conflicto. Una vez m\u00e1s, la forma de hacerlo depende enteramente de su aplicaci\u00f3n. Esto pretende ser una implementaci\u00f3n de referencia sobre c\u00f3mo usted <em>podr\u00eda<\/em> manejarlo.<\/p>\n<pre><code class=\"swift\">\r\n\/\/\/ Merges two conflicting versions of CBL document using following criteria\r\n\/\/\/ - Newly added properties are added \r\n\/\/\/ - If we are updating an existing property, that is ignored a property that already exists\r\n\/\/\/\r\n\/\/\/ - Parameter \r\n\/\/\/   - newDoc: The new version of document to be saved\r\n\/\/\/   - currentDoc : The current saved version of the document\r\nfunc mergeDocument(newDoc: Document, currentDoc: Document) -&gt; MutableDocument {\r\n    \/\/ 1. Create a resolved mutable document based on the current saved document\r\n    let resolved = currentDoc.toMutable()\r\n    \r\n    \/\/ 2. Add the additional properties that don't already exist\r\n    for key in newDoc.keys {\r\n        if !resolved.contains(key) {\r\n            resolved.setValue(newDoc.value(forKey: key), forKey: key)\r\n        }\r\n    }\r\n    return resolved\r\n}<\/code><\/pre>\n<ul>\n<li><strong>Opci\u00f3n 2:<\/strong>\u00a0<strong>Fuerza tu salvaci\u00f3n para ganar<\/strong><\/li>\n<\/ul>\n<p>Esta opci\u00f3n es efectivamente la misma que la pol\u00edtica de concurrencia por defecto de \"las escrituras siempre ganan\". Excepto que en este caso, se examina el contenido del documento actualmente guardado y luego se determina si se debe forzar el guardado utilizando un comando <code>guardarDocumento<\/code>.<br \/>\nTenga en cuenta que a\u00fan podr\u00eda correr el riesgo de una condici\u00f3n de carrera en la que el documento podr\u00eda ser actualizado de nuevo antes de guardarlo.<\/p>\n<pre><code class=\"swift\">do {\r\n    if try db.saveDocument(docToSave, concurrencyControl: .failOnConflict) {\r\n        \/\/ save was a success. docToSave is the new saved revision. Proceed as usual\r\n    }\r\n    else {\r\n        \/\/ Failure on save with failOnConflict mode\r\n        \/\/ Handle conflict appropriately\r\n        if let currDoc = db.document(withID: docToSave.id) {\r\n            \/\/ Option 2: Examine contents of current saved version of doc\r\n            \/\/ Force write of document\r\n            try db.saveDocument(docToSave)\r\n        }\r\n        else {\r\n            \/\/ Doc was deleted.\r\n            \/\/ Option 2: Attempt to do a force write of document to override the delete\r\n            try db.saveDocument(docToSave)\r\n        }\r\n    }\r\n}\r\ncatch {\r\n    print(\"Some other error in saving \\(error)\")\r\n}<\/code><\/pre>\n<ul>\n<li><strong>Opci\u00f3n 3:<\/strong>\u00a0<strong>Saltar la parada<\/strong><\/li>\n<\/ul>\n<p>En este caso, podr\u00eda examinar el contenido del documento guardado actualmente y, a continuaci\u00f3n, determinar que prefiere conservar la versi\u00f3n guardada actualmente del documento.<\/p>\n<pre><code class=\"swift\">do {\r\n    let docToSave = MutableDocument(id: \"docId\")\r\n    if !(try db.saveDocument(docToSave, concurrencyControl: .failOnConflict)) {\r\n        \/\/ Fetch the current saved version of doc\r\n        if let currDoc = db.document(withID: docToSave.id) {\r\n            \/\/ Option 3 : Examine contents of doc\r\n            \/\/ Current saved doc looks fine. Do nothing\r\n        }\r\n        else {\r\n            \/\/ Doc was deleted. Handle appropriately\r\n        }\r\n    }\r\n    else {\r\n        \/\/ save was a success. docToSave is the new saved revision. Proceed as usual\r\n    }\r\n}\r\ncatch {\r\n    print(\"Some other error in saving \\(error)\")\r\n}\r\n<\/code><\/pre>\n<h3 id=\"implicationsoncreatingdocumentswithsameid\">Implicaciones en la creaci\u00f3n de documentos con el mismo Id.<\/h3>\n<p>Dado que la pol\u00edtica de resoluci\u00f3n de conflictos por defecto en <code>guardarDocumento<\/code> es que la \u00faltima escritura siempre gana, si se intenta crear de nuevo un documento con un <code>docId<\/code> que ya existe en la base de datos, seguir\u00e1 adelante y actualizar\u00e1 el documento existente a\u00f1adi\u00e9ndole una nueva revisi\u00f3n.<\/p>\n<p>Por lo tanto, si desea asegurarse de que no actualiza inadvertidamente un documento existente, debe especificar el valor \"<em>ConcurrenyControl<\/em> argumento con <code>failOnConflict<\/code>. Esto devolver\u00e1 un error que podr\u00e1 gestionar adecuadamente.<\/p>\n<p>Es muy similar a la opci\u00f3n 3 especificada anteriormente, salvo que en este caso no es necesario examinar el contenido actual del documento. Un fallo de conflicto implica que ya existe un documento con Id.<\/p>\n<p>Este es un ejemplo en Swift<\/p>\n<pre><code class=\"swift\">do {\r\n    let docToSave = MutableDocument(id: \"docId\")\r\n    if !(try db.saveDocument(docToSave, concurrencyControl: .failOnConflict)) {\r\n        \/\/ Document with Id already exists. Handle appropriately\r\n    }\r\n    else {\r\n        \/\/ save was a success. docToSave is the new saved revision. Proceed as usual\r\n    }\r\n}\r\ncatch {\r\n    print(\"Some other error in saving \\(error)\")\r\n}<\/code><\/pre>\n<h3 id=\"conflictfreemodeinsyncgateway2.0\">Modo sin conflictos en Sync Gateway 2.0<\/h3>\n<p>En este modo, la pasarela de sincronizaci\u00f3n rechaza las revisiones que causan un conflicto con un Error HTTP 409, asegurando as\u00ed que no hay revisiones conflictivas en la base de datos. Los conflictos se gestionan en el lado del cliente durante una replicaci\u00f3n pull.<\/p>\n<h4 id=\"pushreplication\">Replicaci\u00f3n Push<\/h4>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/01\/conflict-free-push.png\" alt=\"\" \/><\/figure>\n<ol>\n<li>El cliente env\u00eda los cambios de revisi\u00f3n a Sync Gateway.<\/li>\n<li>Sync Gateway detecta que la revisi\u00f3n entrante entra en conflicto con la revisi\u00f3n actual guardada en el servidor (es decir, el ancestro de la revisi\u00f3n entrante no es la revisi\u00f3n activa en el servidor).<\/li>\n<li>Sync Gateway rechaza el cambio de revisi\u00f3n con un <em>409 Error<\/em>. Couchbase Lite realmente no hace nada m\u00e1s que registrar el error. El conflicto se resuelve posteriormente durante una replicaci\u00f3n pull.<\/li>\n<\/ol>\n<h4 id=\"pullreplication\">Replicaci\u00f3n Pull<\/h4>\n<p>Durante una replicaci\u00f3n pull, si el cliente detecta un conflicto, \u00e9ste se resuelve utilizando los siguientes criterios deterministas<\/p>\n<ul>\n<li>Los borrados siempre ganan. Un ejemplo de este caso es el que se muestra a continuaci\u00f3n.<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/deletes_always_win.png\" alt=\"\" \/><\/p>\n<ul>\n<li>El cambio m\u00e1s reciente (el m\u00e1s alto <code>ID de generaci\u00f3n<\/code>) gana o la revisi\u00f3n con max <code>revID<\/code> gana si las generaciones son iguales. es decir - el revID que ordena m\u00e1s alto en una simple comparaci\u00f3n ASCII. A continuaci\u00f3n se muestra un ejemplo.<\/li>\n<\/ul>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/most_recent_writes_win.png\" alt=\"\" \/><\/figure>\n<p>&nbsp;<\/p>\n<p>A continuaci\u00f3n, examinamos los casos durante la Replicaci\u00f3n Pull.<\/p>\n<p><strong>La rama de servidores es la ganadora<\/strong><\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/conflict-free-pull-server-winner.png\" alt=\"\" \/><\/figure>\n<ol>\n<li>El cliente extrae los cambios de revisi\u00f3n del Sync Gateway<\/li>\n<li>El cliente detecta que la revisi\u00f3n entrante est\u00e1 en conflicto con la revisi\u00f3n guardada actual (es decir, la revisi\u00f3n entrante y la revisi\u00f3n guardada comparten un padre com\u00fan).<\/li>\n<li>El cliente llama a la funci\u00f3n de resoluci\u00f3n de conflictos que determina el ganador entre la revisi\u00f3n actual guardada y la revisi\u00f3n del servidor.\n<ol>\n<li>Dado que la revisi\u00f3n entrante (<code>Rev2-B<\/code>) del servidor es m\u00e1s reciente que la revisi\u00f3n local (<code>Rev2-A<\/code>), se selecciona la revisi\u00f3n del servidor como ganadora. Tenga en cuenta que esto tambi\u00e9n ocurrir\u00eda si la revisi\u00f3n del servidor se borrara.<\/li>\n<\/ol>\n<\/li>\n<li>La rama del servidor se injerta en el \u00e1rbol de revisi\u00f3n local (y la rama local se tombstoned)<\/li>\n<li>Posteriormente, cuando los cambios se env\u00eden al servidor, no habr\u00e1 conflictos y el servidor se sincronizar\u00e1 con el cliente.<\/li>\n<\/ol>\n<h5 id=\"localbranchisthewinner\"><strong>La sucursal local es la ganadora<\/strong><\/h5>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/conflict-free-pull-local-winner.png\" alt=\"\" \/><\/figure>\n<ol>\n<li>El cliente extrae los cambios de revisi\u00f3n del Sync Gateway<\/li>\n<li>El cliente detecta que la revisi\u00f3n entrante est\u00e1 en conflicto con la revisi\u00f3n guardada actual (es decir, la revisi\u00f3n entrante y la revisi\u00f3n guardada comparten un padre com\u00fan).<\/li>\n<li>El cliente llama a la funci\u00f3n de resoluci\u00f3n de conflictos que determina el ganador entre la revisi\u00f3n actual guardada y la revisi\u00f3n del servidor.\n<ol>\n<li>Dado que la revisi\u00f3n local (<code>Rev2-B<\/code>) es la m\u00e1s reciente que la revisi\u00f3n del servidor entrante (<code>Rev2-A<\/code>), la revisi\u00f3n local es seleccionada como la ganadora. Tenga en cuenta que esto tambi\u00e9n ocurrir\u00eda si la revisi\u00f3n de la rama local fuera eliminada.<\/li>\n<\/ol>\n<\/li>\n<li>La rama del servidor se injerta en el \u00e1rbol de revisiones local y se crea una nueva revisi\u00f3n <code>Rev3<\/code> que corresponde al contenido de la revisi\u00f3n ganadora, <code>Rev2-B<\/code><\/li>\n<li>Posteriormente, cuando los cambios se env\u00eden al servidor, no habr\u00e1 conflictos y el servidor se sincronizar\u00e1 con el cliente.<\/li>\n<\/ol>\n<p><strong>NOTA<\/strong>: Como usted ha observado, los conflictos se resuelven en Couchbase Lite durante una replicaci\u00f3n pull. La implicaci\u00f3n de esto es que si el replicador est\u00e1 configurado para ser s\u00f3lo un replicador de empuje, a continuaci\u00f3n, la vista de Couchbase Lite de los datos divergentes de Sync Gateway (ya que algunos de los intentos de CBL escribe fallar\u00eda w \/ 409). Por lo tanto, si prev\u00e9 que se produzcan conflictos, se recomienda que el replicador de Couchbase Lite se configure en modo push-pull cuando se utilice en modo Conflict Free.<\/p>\n<p>&nbsp;<\/p>\n<h3>Configuraci\u00f3n del modo libre de conflictos en Sync Gateway<\/h3>\n<p>El modo \"Sin conflictos\" de Sync Gateway se puede configurar a trav\u00e9s de <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/2.0\/guides\/sync-gateway\/config-properties\/index.html#2.0\/databases-foo_db-allow_conflicts\">permitir_conflictos<\/a>\u00a0en el archivo de configuraci\u00f3n de Sync Gateway. Debe tener el valor \"<em>falso<\/em>\" para habilitar el modo libre de conflictos. Tambi\u00e9n debe tenerse en cuenta que, independientemente de la configuraci\u00f3n de esta propiedad, no habr\u00e1 revisiones conflictivas a\u00f1adidas a la puerta de enlace de sincronizaci\u00f3n cuando se sincronice con clientes Couchbase Lite 2.0. Ya hemos hablado de ello en la secci\u00f3n sobre Replicaci\u00f3n. La configuraci\u00f3n \"allow_conflicts\" s\u00f3lo tiene implicaciones para clientes no 2.0 y clientes REST API. La siguiente tabla resume las implicaciones<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4867\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/allow_conflict.png\" alt=\"allow_conflicts_configuration\" width=\"501\" height=\"222\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/allow_conflict.png 501w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/allow_conflict-300x133.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/allow_conflict-20x9.png 20w\" sizes=\"auto, (max-width: 501px) 100vw, 501px\" \/><\/p>\n<h2 id=\"impactofconflictfreemodeondatabasesizes\">Impacto del modo libre de conflictos en el tama\u00f1o de las bases de datos<\/h2>\n<p>El impacto de la resoluci\u00f3n de conflictos en el tama\u00f1o de la base de datos se trat\u00f3 en detalle en nuestro anterior post sobre <a href=\"https:\/\/www.couchbase.com\/blog\/es\/database-sizes-and-conflict-resolution\/\">Gesti\u00f3n del tama\u00f1o de las bases de datos<\/a>. En el sistema que permit\u00eda conflictos, a medida que crec\u00edan las revisiones en conflicto, el tama\u00f1o del \u00e1rbol de revisiones pod\u00eda crecer hasta afectar al tama\u00f1o de la base de datos. Por eso era importante resolver los conflictos a tiempo. Sync Gateway tiene un <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/sync-gateway\/config-properties\/index.html#1.5\/databases-foo_db-revs_limit\"><code>l\u00edmite_rev<\/code><\/a> que determina el tama\u00f1o del \u00e1rbol de revisi\u00f3n. La direcci\u00f3n <code>l\u00edmite_rev<\/code> tiene un valor predeterminado de 1000, lo que significa que los metadatos correspondientes a las \u00faltimas 1000 revisiones se almacenan en Sync Gateway antes de ser eliminados. Al establecer la propiedad <code>l\u00edmite_rev<\/code> a un valor grande afectar\u00eda negativamente al tama\u00f1o de la base de datos, era importante no fijarlo a un valor muy bajo. Era importante mantener los metadatos correspondientes a las revisiones m\u00e1s antiguas, ya que eran necesarios para gestionar la resoluci\u00f3n de conflictos; de lo contrario, se corr\u00eda el riesgo de tener un bosque de \u00e1rboles de revisiones desconectados para un documento. As\u00ed que el valor m\u00ednimo permitido de <code>l\u00edmite_rev<\/code> es 20.<\/p>\n<p>Sin embargo, con el modo libre de conflictos, no hay necesidad real de guardar los metadatos correspondientes a las revisiones m\u00e1s antiguas. Esto implica que el <code>l\u00edmite_rev<\/code> podr\u00eda ser s\u00f3lo 1. Esto implica que s\u00f3lo se almacena la \u00faltima revisi\u00f3n\/activa. Esto supone un gran ahorro en el tama\u00f1o de la base de datos.<\/p>\n<h2 id=\"acnowledgements\">Agradecimientos<\/h2>\n<p>Un agradecimiento especial a <a href=\"https:\/\/github.com\/pasin\">Pasin Suriyentrakorn<\/a> del equipo de ingenier\u00eda m\u00f3vil por sus comentarios sobre las secciones de Couchbase Lite, a <a href=\"https:\/\/github.com\/adamcfraser\">Adam Fraser<\/a>, tambi\u00e9n del equipo de Ingenier\u00eda de M\u00f3viles, por sus comentarios sobre las secciones de Sync Gateway y a Daniel Petersen, del equipo de Ingenier\u00eda de M\u00f3viles, por sus comentarios.<\/p>\n<h2 id=\"whatnext\">\u00bfQu\u00e9 sigue?<\/h2>\n<p>Esta entrada del blog discute c\u00f3mo los conflictos se manejan autom\u00e1ticamente en Couchbase Mobile 2.0. Puedes descargar Couchbase Mobile 2.0 desde nuestro <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/2.0\/whatsnew.html\">descargas<\/a> p\u00e1gina.<\/p>\n<p>Si tiene alguna pregunta o sugerencia, deje un comentario a continuaci\u00f3n o p\u00f3ngase en contacto conmigo a trav\u00e9s de Twitter en la direcci\u00f3n\u00a0<a href=\"https:\/\/twitter.com\/rajagp\">@rajagp<\/a>\u00a0o env\u00edeme un correo electr\u00f3nico a\u00a0<a href=\"mailto:priya.rajagopal@couchbase.com\">priya.rajagopal@couchbase.com<\/a>.  En\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/es\/forums\/\">Foros de Couchbase<\/a> son otro buen lugar para plantear preguntas.<\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Document conflicts can occur in distributed environments that support data synchronization, wherein a document can be updated concurrently by one or more writers. This is especially common in mobile environments where unreliable network connections may result in concurrent changes from [&hellip;]<\/p>","protected":false},"author":1423,"featured_media":10700,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1821,7667,1810,2366,2201],"tags":[2178,1980,2004,1981],"ppma_author":[8948],"class_list":["post-4832","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-architecture","category-couchbase-lite","category-couchbase-mobile","category-sync-gateway","category-tools-sdks","tag-concurrency-control","tag-conflict-resolution","tag-couchbase-mobile-2-0","tag-mvcc"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Document Conflicts &amp; Resolution in Couchbase Mobile 2.0<\/title>\n<meta name=\"description\" content=\"This post discusses the fundamentals of how document conflicts are handled in Couchbase Mobile 2.0 using \u201cautomatic conflict resolution\u201d.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/document-conflicts-couchbase-mobile\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Document Conflicts &amp; Resolution in Couchbase Mobile 2.0\" \/>\n<meta property=\"og:description\" content=\"This post discusses the fundamentals of how document conflicts are handled in Couchbase Mobile 2.0 using \u201cautomatic conflict resolution\u201d.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/document-conflicts-couchbase-mobile\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-03-19T14:00:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:43:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/conflict-resolver-basics.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1552\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Priya Rajagopal, Senior Director, Product Management\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@rajagp\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Priya Rajagopal, Senior Director, Product Management\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/\"},\"author\":{\"name\":\"Priya Rajagopal, Senior Director, Product Management\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c\"},\"headline\":\"Document Conflicts &amp; Resolution in Couchbase Mobile 2.0\",\"datePublished\":\"2018-03-19T14:00:32+00:00\",\"dateModified\":\"2025-06-14T06:43:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/\"},\"wordCount\":2307,\"commentCount\":14,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/conflict-resolver-basics.png\",\"keywords\":[\"concurrency control\",\"conflict resolution\",\"couchbase mobile 2.0\",\"MVCC\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Architecture\",\"Couchbase Lite\",\"Couchbase Mobile\",\"Sync Gateway\",\"Tools &amp; SDKs\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/\",\"name\":\"Document Conflicts &amp; Resolution in Couchbase Mobile 2.0\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/conflict-resolver-basics.png\",\"datePublished\":\"2018-03-19T14:00:32+00:00\",\"dateModified\":\"2025-06-14T06:43:12+00:00\",\"description\":\"This post discusses the fundamentals of how document conflicts are handled in Couchbase Mobile 2.0 using \u201cautomatic conflict resolution\u201d.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/conflict-resolver-basics.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/conflict-resolver-basics.png\",\"width\":1552,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Document Conflicts &amp; Resolution in Couchbase Mobile 2.0\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c\",\"name\":\"Priya Rajagopal, Senior Director, Product Management\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b50a54778b979d8c345b036ab138734\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g\",\"caption\":\"Priya Rajagopal, Senior Director, Product Management\"},\"description\":\"Priya Rajagopal is a Senior Director of Product Management at Couchbase responsible for developer platforms for the cloud and the edge. She has been professionally developing software for over 20 years in several technical and product leadership positions, with 10+ years focused on mobile technologies. As a TISPAN IPTV standards delegate, she was a key contributor to the IPTV standards specifications. She has 22 patents in the areas of networking and platform security.\",\"sameAs\":[\"https:\/\/x.com\/rajagp\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/priya-rajagopalcouchbase-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Conflictos y resoluci\u00f3n de documentos en Couchbase Mobile 2.0","description":"Este post discute los fundamentos de c\u00f3mo se manejan los conflictos de documentos en Couchbase Mobile 2.0 usando \"resoluci\u00f3n autom\u00e1tica de conflictos\".","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/document-conflicts-couchbase-mobile\/","og_locale":"es_MX","og_type":"article","og_title":"Document Conflicts &amp; Resolution in Couchbase Mobile 2.0","og_description":"This post discusses the fundamentals of how document conflicts are handled in Couchbase Mobile 2.0 using \u201cautomatic conflict resolution\u201d.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/document-conflicts-couchbase-mobile\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-03-19T14:00:32+00:00","article_modified_time":"2025-06-14T06:43:12+00:00","og_image":[{"width":1552,"height":628,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/conflict-resolver-basics.png","type":"image\/png"}],"author":"Priya Rajagopal, Senior Director, Product Management","twitter_card":"summary_large_image","twitter_creator":"@rajagp","twitter_misc":{"Written by":"Priya Rajagopal, Senior Director, Product Management","Est. reading time":"13 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/"},"author":{"name":"Priya Rajagopal, Senior Director, Product Management","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c"},"headline":"Document Conflicts &amp; Resolution in Couchbase Mobile 2.0","datePublished":"2018-03-19T14:00:32+00:00","dateModified":"2025-06-14T06:43:12+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/"},"wordCount":2307,"commentCount":14,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/conflict-resolver-basics.png","keywords":["concurrency control","conflict resolution","couchbase mobile 2.0","MVCC"],"articleSection":["Best Practices and Tutorials","Couchbase Architecture","Couchbase Lite","Couchbase Mobile","Sync Gateway","Tools &amp; SDKs"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/","url":"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/","name":"Conflictos y resoluci\u00f3n de documentos en Couchbase Mobile 2.0","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/conflict-resolver-basics.png","datePublished":"2018-03-19T14:00:32+00:00","dateModified":"2025-06-14T06:43:12+00:00","description":"Este post discute los fundamentos de c\u00f3mo se manejan los conflictos de documentos en Couchbase Mobile 2.0 usando \"resoluci\u00f3n autom\u00e1tica de conflictos\".","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/conflict-resolver-basics.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/conflict-resolver-basics.png","width":1552,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/document-conflicts-couchbase-mobile\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Document Conflicts &amp; Resolution in Couchbase Mobile 2.0"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c","name":"Priya Rajagopal, Directora de Gesti\u00f3n de Productos","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b50a54778b979d8c345b036ab138734","url":"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g","caption":"Priya Rajagopal, Senior Director, Product Management"},"description":"Priya Rajagopal es directora s\u00e9nior de gesti\u00f3n de productos en Couchbase y responsable de las plataformas de desarrollo para la nube y el per\u00edmetro. Lleva m\u00e1s de 20 a\u00f1os dedic\u00e1ndose profesionalmente al desarrollo de software en varios puestos de liderazgo t\u00e9cnico y de producto, con m\u00e1s de 10 a\u00f1os centrados en tecnolog\u00edas m\u00f3viles. Como delegada de est\u00e1ndares IPTV de TISPAN, fue una colaboradora clave en las especificaciones de est\u00e1ndares IPTV. Tiene 22 patentes en las \u00e1reas de redes y seguridad de plataformas.","sameAs":["https:\/\/x.com\/rajagp"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/priya-rajagopalcouchbase-com\/"}]}},"authors":[{"term_id":8948,"user_id":1423,"is_guest":0,"slug":"priya-rajagopalcouchbase-com","display_name":"Priya Rajagopal, Senior Director, Product Management","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g","author_category":"","last_name":"Rajagopal, Senior Director, Product Management","first_name":"Priya","job_title":"","user_url":"","description":"Priya Rajagopal es directora s\u00e9nior de gesti\u00f3n de productos en Couchbase y responsable de las plataformas de desarrollo para la nube y el per\u00edmetro. Lleva m\u00e1s de 20 a\u00f1os dedic\u00e1ndose profesionalmente al desarrollo de software en varios puestos de liderazgo t\u00e9cnico y de producto, con m\u00e1s de 10 a\u00f1os centrados en tecnolog\u00edas m\u00f3viles. Como delegada de est\u00e1ndares IPTV de TISPAN, fue una colaboradora clave en las especificaciones de est\u00e1ndares IPTV. Tiene 22 patentes en las \u00e1reas de redes y seguridad de plataformas."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4832","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/1423"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=4832"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4832\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/10700"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=4832"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=4832"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=4832"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=4832"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}