{"id":3584,"date":"2017-05-25T02:00:18","date_gmt":"2017-05-25T09:00:18","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=3584"},"modified":"2025-06-13T18:46:08","modified_gmt":"2025-06-14T01:46:08","slug":"conflict-resolution-couchbase-mobile","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/conflict-resolution-couchbase-mobile\/","title":{"rendered":"Desmistificando a resolu\u00e7\u00e3o de conflitos no Couchbase Mobile"},"content":{"rendered":"<p>Os conflitos podem ocorrer em ambientes de replica\u00e7\u00e3o em que um documento pode ser atualizado simultaneamente por um ou mais gravadores. Isso \u00e9 especialmente comum em ambientes m\u00f3veis, nos quais conex\u00f5es de rede n\u00e3o confi\u00e1veis podem fazer com que as altera\u00e7\u00f5es simult\u00e2neas de v\u00e1rios dispositivos n\u00e3o sejam sincronizadas em tempo h\u00e1bil, resultando em conflitos.<\/p>\n<p>Nesta postagem, discutimos os fundamentos de como os conflitos s\u00e3o tratados no Couchbase Mobile e descrevemos a fun\u00e7\u00e3o dos aplicativos na resolu\u00e7\u00e3o de conflitos. Em uma pr\u00f3xima publica\u00e7\u00e3o, discutiremos um t\u00f3pico relacionado ao gerenciamento de \u00e1rvores de revis\u00e3o e tamanhos de banco de dados em um sistema de gerenciamento de documentos baseado em revis\u00e3o.<\/p>\n<p>O processo de resolu\u00e7\u00e3o de conflitos discutido neste blog se aplica ao Couchbase Mobile 1.x. Confira este <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/document-conflicts-couchbase-mobile\/\">postagem<\/a> sobre os detalhes do processo de resolu\u00e7\u00e3o autom\u00e1tica de conflitos no Couchbase Mobile 2.x. Confira nosso <a href=\"https:\/\/docs.couchbase.com\/couchbase-lite\/2.6\/swift.html#custom-conflict-resolution\">documenta\u00e7\u00e3o<\/a> para uma discuss\u00e3o sobre a resolu\u00e7\u00e3o de conflitos personalizada no Couchbase Mobile 2.x.<\/p>\n<p><!--more--><br \/>\nA ilustra\u00e7\u00e3o abaixo descreve um cen\u00e1rio em que podem ocorrer conflitos em ambientes m\u00f3veis<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3629\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/conflict-basics-1.png\" alt=\"Basics of how conflicts created\" width=\"663\" height=\"522\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-basics-1.png 794w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-basics-1-300x236.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-basics-1-768x605.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-basics-1-20x16.png 20w\" sizes=\"auto, (max-width: 663px) 100vw, 663px\" \/><\/p>\n<p>&nbsp;<\/p>\n<h2>Hist\u00f3rico<\/h2>\n<p>O <a href=\"https:\/\/developer.couchbase.com\/mobile\">Couchbase Mobile <\/a>A pilha inclui o <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.4\/guides\/couchbase-lite\/index.html\">Couchbase Lite<\/a> banco de dados incorporado executado localmente em dispositivos e <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.4\/guides\/sync-gateway\/index.html\">Gateway de sincroniza\u00e7\u00e3o<\/a> na nuvem, que normalmente \u00e9 apoiada por <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/introduction\/intro.html\">Servidor Couchbase <\/a>mantendo os dados na nuvem. O Sync Gateway lida com a replica\u00e7\u00e3o de documentos entre os dispositivos. \u00c9 conceb\u00edvel que um documento possa ser atualizado por v\u00e1rios dispositivos ao mesmo tempo.<\/p>\n<p>&nbsp;<\/p>\n<h2>Controle de simultaneidade de v\u00e1rias vers\u00f5es<\/h2>\n<p>O Couchbase Mobile usa a t\u00e9cnica de controle de simultaneidade de v\u00e1rias vers\u00f5es (MVCC) para lidar com conflitos. Nesse m\u00e9todo, cada documento recebe uma ID de revis\u00e3o exclusiva gerada pelo sistema. Esse ID \u00e9 adicional ao ID do documento, que permanece o mesmo em todas as revis\u00f5es do documento. Toda altera\u00e7\u00e3o em um documento, seja ela uma modifica\u00e7\u00e3o ou uma exclus\u00e3o, \u00e9 tratada como uma nova revis\u00e3o do documento e, portanto, recebe um novo ID de revis\u00e3o.<\/p>\n<h3>\u00c1rvore de revis\u00e3o<\/h3>\n<p>Sempre que uma altera\u00e7\u00e3o for feita em um documento existente, o redator dever\u00e1 incluir o ID de revis\u00e3o da revis\u00e3o atual do documento que est\u00e1 sendo atualizado. Uma nova revis\u00e3o \u00e9 criada para a altera\u00e7\u00e3o e adicionada como um n\u00f3 filho \u00e0 revis\u00e3o atual que estava sendo atualizada, resultando em uma \u00e1rvore de revis\u00e3o para o documento.<\/p>\n<h3><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3632\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/revision-tree-latest.png\" alt=\"\" width=\"186\" height=\"235\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/revision-tree-latest.png 186w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/revision-tree-latest-16x20.png 16w\" sizes=\"auto, (max-width: 186px) 100vw, 186px\" \/><\/h3>\n<p>Cada documento tem uma \u00e1rvore de revis\u00e3o associada que cresce ao longo da vida \u00fatil do documento. Discutiremos t\u00e9cnicas para gerenciar o tamanho da \u00e1rvore em um post futuro - fique atento!<\/p>\n<h3>Estrutura do documento<\/h3>\n<p>Em um n\u00edvel muito alto, cada documento no Couchbase Mobile V1.4 \u00e9 composto de um ID de documento, ID de revis\u00e3o atual, corpo JSON e metadados. Os metadados, entre outras coisas, cont\u00eam o hist\u00f3rico de revis\u00e3o do documento. Os metadados s\u00e3o um conceito de \"bastidores\", e os aplicativos de usu\u00e1rio nunca devem se preocupar com eles.  De fato, em <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/?utm_source=google&amp;utm_medium=cpc&amp;utm_campaign=316854429&amp;utm_term=%2Bcouchbase&amp;utm_content=&amp;_bt=192327536059&amp;_bm=b&amp;_bn=g&amp;gclid=CNvv9Y7ihtQCFUlMDQodPn4Ejw\">vers\u00e3o futura<\/a> do Couchbase, os metadados ser\u00e3o movidos completamente para fora do documento e para um XATTR.<\/p>\n<p>Al\u00e9m disso, cada revis\u00e3o de documento tem um valor TTL associado (que tem como padr\u00e3o 5 minutos).<\/p>\n<h3>Revis\u00f5es de l\u00e1pides<\/h3>\n<p>Em um sistema baseado em MVCC, toda atualiza\u00e7\u00e3o, incluindo uma opera\u00e7\u00e3o de exclus\u00e3o, cria uma revis\u00e3o de documento.  As revis\u00f5es exclu\u00eddas s\u00e3o chamadas de revis\u00f5es \"Tombstone\". Uma revis\u00e3o exclu\u00edda \u00e9 essencialmente uma revis\u00e3o especial que tem a propriedade \"_deleted\" como verdadeira. As revis\u00f5es de exclus\u00e3o s\u00e3o replicadas.  Essas revis\u00f5es s\u00e3o especiais, pois se voc\u00ea fizer uma consulta no Couchbase Lite, elas n\u00e3o ser\u00e3o retornadas.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3593\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/revision-tree-2.png\" alt=\"Revision Tombstone\" width=\"267\" height=\"422\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/revision-tree-2.png 267w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/revision-tree-2-190x300.png 190w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/revision-tree-2-13x20.png 13w\" sizes=\"auto, (max-width: 267px) 100vw, 267px\" \/><\/p>\n<h3>A estrutura de ID da revis\u00e3o<\/h3>\n<p>A ID de revis\u00e3o tem o formato <em>\"-\"<\/em><\/p>\n<ul>\n<li>\u00a0\u00a0<em>ID da gera\u00e7\u00e3o (nova revis\u00e3o) = ID da gera\u00e7\u00e3o (pai da revis\u00e3o) + 1<\/em><\/li>\n<\/ul>\n<p>A primeira revis\u00e3o que \u00e9 criada quando um documento \u00e9 criado tem um ID de gera\u00e7\u00e3o de 1<\/p>\n<ul>\n<li>ID do hash do conte\u00fado =\u00a0 <em>hash calculado a partir do conte\u00fado da revis\u00e3o<\/em><\/li>\n<\/ul>\n<p>Isso implica que duas revis\u00f5es de um documento com conte\u00fado id\u00eantico ter\u00e3o o mesmo ID de hash de conte\u00fado.<\/p>\n<p><em>Observa\u00e7\u00e3o<\/em>: Como otimiza\u00e7\u00e3o, se dois escritores fizerem altera\u00e7\u00f5es id\u00eanticas em um documento simultaneamente, resultando em duas revis\u00f5es de entrada com o mesmo ID de revis\u00e3o, o Couchbase Mobile armazenar\u00e1 apenas uma \u00fanica revis\u00e3o.<\/p>\n<h2>\u00a0Conflitos<\/h2>\n<p>Em um sistema baseado em MVCC, ocorre um conflito se o sistema encontrar uma ramifica\u00e7\u00e3o na \u00e1rvore. A partir da discuss\u00e3o sobre \u00e1rvores de revis\u00e3o, voc\u00ea pode inferir que esse seria o caso em que h\u00e1 dois ou mais n\u00f3s de folha na \u00e1rvore.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3594\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/conflict-branch-1.png\" alt=\"conflict branch\" width=\"539\" height=\"353\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-branch-1.png 539w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-branch-1-300x196.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-branch-1-20x13.png 20w\" sizes=\"auto, (max-width: 539px) 100vw, 539px\" \/><\/p>\n<h3>Revis\u00e3o atual<\/h3>\n<p>Quando ocorre um conflito, o Couchbase Mobile ainda precisa selecionar um \"vencedor\" ou \"Revis\u00e3o atual\" entre os n\u00f3s folha conflitantes. A escolha de um vencedor n\u00e3o significa que o conflito foi resolvido.<\/p>\n<p>O Couchbase Mobile escolhe um vencedor de forma determin\u00edstica. Devido \u00e0 natureza determin\u00edstica do processo, n\u00e3o h\u00e1 necessidade de os n\u00f3s do Couchbase Mobile se comunicarem entre si para escolher os vencedores - todos eles escolhem o mesmo vencedor usando os seguintes crit\u00e9rios<\/p>\n<h4>Caso 1: Todas as revis\u00f5es de folhas n\u00e3o s\u00e3o exclu\u00eddas<\/h4>\n<ul>\n<li>O vencedor \u00e9 a revis\u00e3o de folha n\u00e3o exclu\u00edda no ramo de revis\u00e3o mais longo<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3595\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/conflicts-explained.png\" alt=\"current revision - case1\" width=\"363\" height=\"552\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflicts-explained.png 363w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflicts-explained-197x300.png 197w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflicts-explained-300x456.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflicts-explained-13x20.png 13w\" sizes=\"auto, (max-width: 363px) 100vw, 363px\" \/><\/p>\n<h4>Caso 2: Todas as revis\u00f5es de folhas s\u00e3o exclu\u00eddas<\/h4>\n<p>O vencedor \u00e9 a revis\u00e3o de folha exclu\u00edda no ramo de revis\u00e3o mais longo<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3596\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/winner-2.png\" alt=\"conflict resolution -case2\" width=\"363\" height=\"550\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/winner-2.png 363w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/winner-2-198x300.png 198w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/winner-2-300x455.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/winner-2-13x20.png 13w\" sizes=\"auto, (max-width: 363px) 100vw, 363px\" \/><\/p>\n<h4>Caso 3: Algumas revis\u00f5es de folhas s\u00e3o exclu\u00eddas e outras n\u00e3o s\u00e3o exclu\u00eddas<\/h4>\n<p>O vencedor \u00e9 a revis\u00e3o de folha n\u00e3o exclu\u00edda no ramo de revis\u00e3o mais longo<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3597\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/conflicts-explained-2.png\" alt=\"conflict resolution case3\" width=\"363\" height=\"562\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflicts-explained-2.png 363w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflicts-explained-2-194x300.png 194w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflicts-explained-2-300x464.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflicts-explained-2-13x20.png 13w\" sizes=\"auto, (max-width: 363px) 100vw, 363px\" \/><\/p>\n<h4>Caso 4: H\u00e1 um empate<\/h4>\n<p>O vencedor \u00e9 aquele cuja ID de revis\u00e3o \u00e9 mais alta em uma compara\u00e7\u00e3o ASCII simples<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3598\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/winner-3.png\" alt=\"conflict resolution - case 4\" width=\"446\" height=\"492\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/winner-3.png 446w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/winner-3-272x300.png 272w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/winner-3-300x331.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/winner-3-18x20.png 18w\" sizes=\"auto, (max-width: 446px) 100vw, 446px\" \/><\/p>\n<h2>Resolu\u00e7\u00e3o de conflitos<\/h2>\n<h3>Quem deve lidar com os conflitos?<\/h3>\n<p>Embora o Couchbase Mobile escolha uma Revis\u00e3o Atual entre as revis\u00f5es conflitantes, em \u00faltima an\u00e1lise, \u00e9 responsabilidade do aplicativo resolver os conflitos pelos seguintes motivos<\/p>\n<ul>\n<li>A escolha do vencedor entre as revis\u00f5es conflitantes pode ser baseada em crit\u00e9rios diferentes daqueles que o sistema usa para escolher deterministicamente um vencedor. A revis\u00e3o atual selecionada pelo Couchbase pode n\u00e3o ser a escolha certa para o aplicativo.<\/li>\n<li>N\u00e3o h\u00e1 um vencedor claro entre as resolu\u00e7\u00f5es conflitantes. Portanto, nesse caso, pode ser necess\u00e1rio mesclar altera\u00e7\u00f5es de revis\u00f5es conflitantes. As especificidades de uma mesclagem dependem da sem\u00e2ntica do aplicativo.<\/li>\n<li>Mesmo que o aplicativo decida usar a revis\u00e3o que o Couchbase escolheu como vencedora, lembre-se de que as revis\u00f5es conflitantes ainda permanecem no banco de dados. Portanto, o aplicativo ainda deve excluir as revis\u00f5es n\u00e3o vencedoras da \u00e1rvore de revis\u00e3o para evitar que a \u00e1rvore de revis\u00e3o fique muito grande com revis\u00f5es conflitantes n\u00e3o utilizadas. Isso ser\u00e1 discutido em profundidade em uma pr\u00f3xima postagem.<\/li>\n<\/ul>\n<h3>Op\u00e7\u00f5es para lidar com conflitos<\/h3>\n<p>H\u00e1 duas op\u00e7\u00f5es para lidar com conflitos<\/p>\n<h4>Op\u00e7\u00e3o 1: Escolha uma revis\u00e3o entre as revis\u00f5es conflitantes<\/h4>\n<p>Nessa op\u00e7\u00e3o, uma das revis\u00f5es conflitantes \u00e9 considerada a vencedora e as demais s\u00e3o \"tombadas\".<\/p>\n<p>O aplicativo pode manter a \"Revis\u00e3o atual\" escolhida pelo Couchbase como a vencedora ou pode escolher uma revis\u00e3o diferente entre as revis\u00f5es conflitantes. Independentemente disso, \u00e9 importante excluir os n\u00e3o vencedores para que eles possam ser eliminados durante a compacta\u00e7\u00e3o do banco de dados, conforme discutido na pr\u00f3xima se\u00e7\u00e3o<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3599\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/conflict-resolution-1-2.png\" alt=\"conflict resolution with tombstone\" width=\"432\" height=\"398\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-resolution-1-2.png 432w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-resolution-1-2-300x276.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-resolution-1-2-20x18.png 20w\" sizes=\"auto, (max-width: 432px) 100vw, 432px\" \/><\/p>\n<h4>Op\u00e7\u00e3o 2: N-way-merge<\/h4>\n<p>Nessa op\u00e7\u00e3o, as altera\u00e7\u00f5es de revis\u00f5es conflitantes s\u00e3o mescladas de acordo com a sem\u00e2ntica do aplicativo. As fus\u00f5es v\u00e3o para uma nova revis\u00e3o que se torna a revis\u00e3o atual\/vencedora. O ramo n\u00e3o vencedor \u00e9 tombado.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3631\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/conflict-resolution-merge.png\" alt=\"conflict resolution- n way merge\" width=\"388\" height=\"393\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-resolution-merge.png 388w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-resolution-merge-296x300.png 296w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-resolution-merge-65x65.png 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-resolution-merge-50x50.png 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-resolution-merge-300x304.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-resolution-merge-20x20.png 20w\" sizes=\"auto, (max-width: 388px) 100vw, 388px\" \/><\/p>\n<h3>E se os conflitos n\u00e3o forem resolvidos?<\/h3>\n<p>Se um aplicativo decidir escolher o vencedor escolhido pelo Couchbase Mobile e n\u00e3o resolver explicitamente os conflitos, voc\u00ea pode acabar com uma \u00e1rvore de revis\u00e3o com um grande n\u00famero de ramifica\u00e7\u00f5es e n\u00f3s de folhas. Isso ter\u00e1 consequ\u00eancias indesej\u00e1veis no tamanho do documento e, consequentemente, no tamanho do banco de dados. O Couchbase Mobile possui processos autom\u00e1ticos para aliviar parte desse problema, mas o aplicativo \u00e9 o principal respons\u00e1vel por garantir que as revis\u00f5es de folhas indesejadas sejam eliminadas.<\/p>\n<p>Discutiremos os detalhes do gerenciamento do banco de dados e da \u00e1rvore de revis\u00e3o em um pr\u00f3ximo post, portanto, fique atento.<\/p>\n<h2>E agora?<\/h2>\n<p>Este post foi uma introdu\u00e7\u00e3o ao sistema de controle de simultaneidade no Couchbase Mobile. Uma considera\u00e7\u00e3o importante em um sistema baseado no MVCC \u00e9 o gerenciamento do tamanho das \u00e1rvores de revis\u00e3o e a preven\u00e7\u00e3o do seu incha\u00e7o. Esse aspecto ser\u00e1 discutido em uma pr\u00f3xima publica\u00e7\u00e3o.<\/p>\n<p>Se tiver d\u00favidas ou coment\u00e1rios, deixe um coment\u00e1rio abaixo ou entre em contato comigo pelo Twitter <a href=\"https:\/\/twitter.com\/rajagp\">@rajagp<\/a> ou envie-me um e-mail <a href=\"mailto:priya.rajagopal@couchbase.com\">priya.rajagopal@couchbase.com<\/a>.  O\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/\">F\u00f3runs do Couchbase<\/a>\u00a0s\u00e3o outro bom lugar para entrar em contato com perguntas.<\/p>\n<p>Por fim, um breve agradecimento a\u00a0<a href=\"mailto:traun@couchbase.com\">Traun Leyden<\/a> e <a href=\"mailto:sachin.smotra@couchbase.com\">Sachin Smotra<\/a>\u00a0por suas contribui\u00e7\u00f5es para esta publica\u00e7\u00e3o.<\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Conflicts can occur in replication environments where a document can be updated concurrently by one or more writers.\u00a0This is especially common in mobile environments wherein unreliable network connections may result in concurrent changes from multiple devices not being synchronized in [&hellip;]<\/p>","protected":false},"author":1423,"featured_media":3585,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1821,1810],"tags":[1980,1968,1981,1725],"ppma_author":[8948],"class_list":["post-3584","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-architecture","category-couchbase-mobile","tag-conflict-resolution","tag-embedded-database","tag-mvcc","tag-nosql-database"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Conflict Resolution in Multi Version Concurrency Control System<\/title>\n<meta name=\"description\" content=\"Conflicts can occur in replication environments where a document can be updated concurrently by one or more writers.\" \/>\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\/pt\/conflict-resolution-couchbase-mobile\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Demystifying Conflict Resolution in Couchbase Mobile\" \/>\n<meta property=\"og:description\" content=\"Conflicts can occur in replication environments where a document can be updated concurrently by one or more writers.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/conflict-resolution-couchbase-mobile\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-05-25T09:00:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T01:46:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-basics.png\" \/>\n\t<meta property=\"og:image:width\" content=\"787\" \/>\n\t<meta property=\"og:image:height\" content=\"522\" \/>\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=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/\"},\"author\":{\"name\":\"Priya Rajagopal, Senior Director, Product Management\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c\"},\"headline\":\"Demystifying Conflict Resolution in Couchbase Mobile\",\"datePublished\":\"2017-05-25T09:00:18+00:00\",\"dateModified\":\"2025-06-14T01:46:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/\"},\"wordCount\":1344,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-basics.png\",\"keywords\":[\"conflict resolution\",\"embedded database\",\"MVCC\",\"NoSQL Database\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Architecture\",\"Couchbase Mobile\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/\",\"name\":\"Conflict Resolution in Multi Version Concurrency Control System\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-basics.png\",\"datePublished\":\"2017-05-25T09:00:18+00:00\",\"dateModified\":\"2025-06-14T01:46:08+00:00\",\"description\":\"Conflicts can occur in replication environments where a document can be updated concurrently by one or more writers.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-basics.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-basics.png\",\"width\":787,\"height\":522,\"caption\":\"Conflict Resolution\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Demystifying Conflict Resolution in Couchbase Mobile\"}]},{\"@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\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\",\"@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\/pt\/author\/priya-rajagopalcouchbase-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Conflict Resolution in Multi Version Concurrency Control System","description":"Conflicts can occur in replication environments where a document can be updated concurrently by one or more writers.","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\/pt\/conflict-resolution-couchbase-mobile\/","og_locale":"pt_BR","og_type":"article","og_title":"Demystifying Conflict Resolution in Couchbase Mobile","og_description":"Conflicts can occur in replication environments where a document can be updated concurrently by one or more writers.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/conflict-resolution-couchbase-mobile\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-05-25T09:00:18+00:00","article_modified_time":"2025-06-14T01:46:08+00:00","og_image":[{"width":787,"height":522,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-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":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/"},"author":{"name":"Priya Rajagopal, Senior Director, Product Management","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c"},"headline":"Demystifying Conflict Resolution in Couchbase Mobile","datePublished":"2017-05-25T09:00:18+00:00","dateModified":"2025-06-14T01:46:08+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/"},"wordCount":1344,"commentCount":3,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-basics.png","keywords":["conflict resolution","embedded database","MVCC","NoSQL Database"],"articleSection":["Best Practices and Tutorials","Couchbase Architecture","Couchbase Mobile"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/","url":"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/","name":"Conflict Resolution in Multi Version Concurrency Control System","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-basics.png","datePublished":"2017-05-25T09:00:18+00:00","dateModified":"2025-06-14T01:46:08+00:00","description":"Conflicts can occur in replication environments where a document can be updated concurrently by one or more writers.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-basics.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/05\/conflict-basics.png","width":787,"height":522,"caption":"Conflict Resolution"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/conflict-resolution-couchbase-mobile\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Demystifying Conflict Resolution in Couchbase Mobile"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados 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":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@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, Diretora S\u00eanior, Gerenciamento de Produtos","image":{"@type":"ImageObject","inLanguage":"pt-BR","@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 \u00e9 diretora s\u00eanior de gerenciamento de produtos da Couchbase, respons\u00e1vel pelas plataformas de desenvolvedor para a nuvem e a borda. Ela desenvolve software profissionalmente h\u00e1 mais de 20 anos em v\u00e1rios cargos t\u00e9cnicos e de lideran\u00e7a de produtos, com mais de 10 anos de foco em tecnologias m\u00f3veis. Como delegada de padr\u00f5es de IPTV da TISPAN, ela foi uma das principais colaboradoras das especifica\u00e7\u00f5es de padr\u00f5es de IPTV. Ela tem 22 patentes nas \u00e1reas de rede e seguran\u00e7a de plataforma.","sameAs":["https:\/\/x.com\/rajagp"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/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","first_name":"Priya","last_name":"Rajagopal, Senior Director, Product Management","user_url":"","author_category":"","description":"Priya Rajagopal \u00e9 diretora s\u00eanior de gerenciamento de produtos da Couchbase, respons\u00e1vel pelas plataformas de desenvolvedor para a nuvem e a borda. Ela desenvolve software profissionalmente h\u00e1 mais de 20 anos em v\u00e1rios cargos t\u00e9cnicos e de lideran\u00e7a de produtos, com mais de 10 anos de foco em tecnologias m\u00f3veis. Como delegada de padr\u00f5es de IPTV da TISPAN, ela foi uma das principais colaboradoras das especifica\u00e7\u00f5es de padr\u00f5es de IPTV. Ela tem 22 patentes nas \u00e1reas de rede e seguran\u00e7a de plataforma."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/3584","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1423"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=3584"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/3584\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/3585"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=3584"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=3584"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=3584"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=3584"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}