MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Atomicidade, Isolamento e Simultaneidade no MongoDB

Os bancos de dados relacionais mais populares atualmente são compatíveis com  “ACID ” – Atomicidade, Consistência, Isolamento e Durabilidade. Desenvolvedores e DBAs (Administradores de Banco de Dados) que trabalham com bancos de dados relacionais têm um bom entendimento do comportamento do ACID. No entanto, ao trabalhar com bancos de dados NoSQL como a nuvem MongoDB, existem algumas diferenças importantes que são importantes para você entender. O MongoDB oferece grande flexibilidade em armazenamento, esquema e dimensionamento, mas relaxa algumas das propriedades ACID. É essencial entender as diferenças à medida que você modela seus dados e executa comandos do MongoDB.

Atomicidade

A Wikipédia define "Atomicidade"  da seguinte forma:"Em uma transação atômica , uma série de operações de banco de dados todas ocorrer ou nada ocorre. Uma garantia de atomicidade evita que as atualizações no banco de dados ocorram apenas parcialmente, o que pode causar problemas maiores do que a rejeição total da série. Em outras palavras, atomicidade significa indivisibilidadeirredutibilidade".

As operações de gravação do MongoDB são atômicas, apenas no nível de um único documento. Se você estiver modificando vários subdocumentos dentro de um documento, a operação ainda será atômica, mas se estiver modificando vários documentos, a operação não será atômica. Então, como você consegue um comportamento atômico em vários documentos? Você precisa usar um padrão de “confirmação de duas fases” para obter a atomicidade desejada. Aqui está um ótimo exemplo da documentação do MongoDB sobre como implementar esse padrão. O padrão de confirmação de duas fases não é trivial para implementar e acertar - portanto, certifique-se de que a atomicidade de gravação de vários documentos seja algo que você deseja buscar.

Isolamento

A Wikipédia define "Isolamento" da seguinte forma:"Em sistemas de banco de dados, isolamento é uma propriedade que define como/quando as alterações feitas por uma operação se tornam visíveis para outras operações concorrentes". Existem várias maneiras de obter o isolamento com suas operações do MongoDB, por exemplo:

  1. Comando “findAndModifyOperation()”

    Esta é uma das maneiras mais simples de consultar e modificar documentos existentes. O comando pode retornar os valores anteriores dos documentos ou os novos valores atualizados dos documentos. Você também pode classificar os documentos correspondentes, upsert e selecionar quais campos precisam ser retornados:

    db.collection.findAndModify( {
                                   query: <document>,
                                   sort: <document>,
                                   remove: <boolean>,
                                   update: <document>,
                                   new: <boolean>,
                                   fields: <document>,
                                   upsert: <boolean>
                               } );
  2. Padrão "Atualizar se atual"

    Esse padrão é especificado na documentação do  MongoDB. Envolve mais trabalho manual, mas oferece mais controle.

  3. Operador $isolation

    O operador $isolation fornece uma maneira de isolar gravações em vários documentos. No entanto, o operador $isolation não oferece garantia de tudo ou nada – você precisará usar algumas das técnicas de atomicidade especificadas na primeira seção para conseguir isso. Além disso, o operador $isolation não funciona para estilhaços. Este comando costumava ser chamado de “$atomic” – agora foi renomeado corretamente para “$isolated”.

Simultaneidade

O MongoDB usa bloqueios para evitar que vários clientes atualizem o mesmo dado ao mesmo tempo. O MongoDB 2.2+ usa bloqueios de nível de “banco de dados”. Portanto, quando uma operação de gravação bloqueia o banco de dados, todas as outras operações de gravação no mesmo banco de dados (mesmo que sejam para uma coleção separada) são bloqueadas aguardando o bloqueio. O MongoDB usa bloqueios  "writer gananciosos" que favorecem gravações em vez de leituras. Na versão 2.2+, certas operações de longa duração podem gerar seus bloqueios.

Segurança de thread

Nem todas as classes do cliente MongoDB são thread-safe – consulte a documentação do seu driver específico para verificar se as classes que você está usando são thread-safe. Por exemplo, no driver Java, a classe MongoClient é thread-safe. Portanto, você pode usar uma única instância dessa classe em todos os seus threads. Internamente, o MongoClient usa um pool de conexões para gerenciar conexões com o servidor MongoDB.

Como sempre, se você tiver alguma dúvida, entre em contato conosco em [email protected].