MongoDB World is back in NYC June 7 - 9!

Um guia para propriedades ACID em sistemas de gerenciamento de banco de dados

O uso de aplicativos em tempo real e dispositivos IoT, além do crescimento exponencial de ativos de dados não estruturados, está fazendo a transição de organizações para bancos de dados NoSQL em números cada vez maiores. De fato, o mercado NoSQL deve chegar a US$ 74,5 bilhões até 2032, exibindo uma taxa de crescimento (CAAG) de 24,9% de 2024 a 2032 (IARC Group, 2024).

Esse crescimento não é surpreendente, dada a capacidade dos sistemas de gerenciamento de banco de banco de dados NoSQL (DBMS) de gerenciar com eficiência grandes e diversos conjuntos de dados e a análise de big data associada necessária. No entanto, muitos ainda acreditam que o NoSQL DBMS não é capaz de atender um requisito fundamental de muitas organizações — gerenciamento e conformidade de transações ACID. A boa nova é que alguns DBMS NoSQL podem!

Neste artigo, discutiremos o que são transações ACID, propriedades da transação ACID, por que essas transações são importantes e um exemplo de transação ACID em um DBMS NoSQL.


Índice

O que são transações ACID ?


Transações explicadas

Em seu nível mais básico, as transações de banco de dados são um grupo de operações de leitura e gravação de banco de dados que foram concluídas com sucesso de acordo com as definições do DBMS (por exemplo, critérios de transação definidos). Existem dois tipos principais de transações:

  • Transações únicas: uma única transação se refere a uma série de uma ou mais operações de banco de dados resultando em uma ação, concluída com sucesso. Depois de concluída, a transação é aceita e pode ser encontrada em um log de transações. Um exemplo comum de uma única transação é a saída de dinheiro de um caixa eletrônico.

  • Multintransações: uma multitransação, às vezes chamada de transação distribuída, consiste em várias transações interdependentes espalhadas por diferentes bancos de dados e sistemas (por exemplo, sistemas distribuídos). Os registros dessas transações também são encontrados em um log de transações. Um exemplo dessas transações inclui a transferência de dinheiro de uma conta para outra ou um empregado que emite a um novo funcionário um emblema de segurança com uma foto.

É importante observar que algumas transações são necessárias para cumprir padrões rigorosos de integridade dos dados (por exemplo, os dados estão completos e corretos) e consistência dos dados (por exemplo, o valor é o mesmo em todas as tabelas/bancos de dados). Esse é geralmente o caso quando a responsabilidade fiduciária ou a conformidade regulatória está envolvida. Os exemplos incluem bancos comerciais, corretagem de investimentos e acordos legais. Nestas situações, a adesão padrão às definições do DBMS não é suficiente, e são necessárias transações ACID .

Transações ACID

ACID é um acrônimo que significa automatização, consistência, isolamento e resiliência (ACID). Juntos, as propriedades ACID garantem que um conjunto de operações de banco de dados (agrupados em uma transação) deixe o banco de dados em um estado válido mesmo em evento de erros inesperados. Além disso, as transações ACID fornecem o nível de garantias transacionais exigidos por muitas agências regulatórias.

Abaixo está uma visão geral de cada elemento de transação ACID, bem como uma descrição de como um documento de banco de dados é capaz de lidar com esse elemento ACID. Para os fins deste artigo, MongoDB Atlas será usado.


Atomicity

Atomicity garante que todos os comandos que compõem uma transação são tratados como uma unidade única e têm sucesso ou falham juntos. Isto é importante no evento de uma falha do sistema ou interrupção, pois se uma transação não tiver sido completamente processada, ela será descartada e o banco de dados de dados mantém a integridade dos dados.


Como o MongoDB lida com automatização:

No MongoDB, uma operação de gravação é atômica no nível de um único documento, mesmo que a operação modifique vários documentos incorporados em um único documento. Para situações que exigem automatização de leituras e gravações em vários documentos (em uma única coleção ou várias coleções), o MongoDB oferece suporte a transações distribuídas, incluindo transações em conjuntos de réplicas e clusters fragmentados.


Consistência

A consistência garante que as alterações feitas em uma transação sejam preenchidas em todo o sistema de banco de dados (por exemplo, nós) e em alinhamento com as restrições do DBMS. Se a consistência dos dados for afetada adversamente por uma transação em um estado inconsistente, a transação inteira falhará.

Como o MongoDB lida com consistência:

o MongoDB oferece a flexibilidade de normalizar ou duplicar dados para otimizar os aplicativos. Se os dados forem duplicados no esquema, o desenvolvedor deverá decidir como manter os dados duplicados consistentes em várias coleções. Alguns aplicativos exigem que dados duplicados se tornem consistentes imediatamente, enquanto outros aplicativos podem tolerância à leitura de dados obsoletos. Os exemplos estão ilustrados abaixo:

MétodoDescriçãoImpacto no desempenhoUsar
TransaçõesAs atualizações de várias coleções ocorrem em uma única operação atômicaPotencialmente alto, devido à contenção de leituraO aplicação deve sempre retornar dados atualizados e pode suportar um possível impacto ruim no desempenho durante períodos de leituras intensas.
Incorpore dados relacionadosModifique o esquema do aplicativo para incorporar dados relacionados em uma única coleção.Baixo a moderado, dependendo do tamanho do documento e dos índicesO aplicação sempre leia e atualiza os dados relacionados ao mesmo tempo. Esta solução simplifica seu esquema e evita a necessidade de operações $lookup .
Triggers de banco de dadosQuando ocorre uma atualização em uma coleção, os gatilhos atualizam automaticamente outra coleção.Baixo a moderado, com possíveis atrasos no processamento de eventos acionadosSeu aplicativo pode tolerar a leitura de dados ligeiramente obsoletos. Os usuários podem ver dados desatualizados se executarem uma query imediatamente após uma atualização, mas antes que o trigger termine de atualizar a segunda coleção.

Método

Descrição
TransaçõesAs atualizações de várias coleções ocorrem em uma única operação atômica
Incorpore dados relacionadosModifique o esquema do aplicativo para incorporar dados relacionados em uma única coleção.
Triggers de banco de dadosQuando ocorre uma atualização em uma coleção, os gatilhos atualizam automaticamente outra coleção.
Impacto no desempenho
TransaçõesPotencialmente alto, devido à contenção de leitura
Incorpore dados relacionadosBaixo a moderado, dependendo do tamanho do documento e dos índices
Triggers de banco de dadosBaixo a moderado, com possíveis atrasos no processamento de eventos acionados
Usar
TransaçõesO aplicação deve sempre retornar dados atualizados e pode suportar um possível impacto ruim no desempenho durante períodos de leituras intensas.
Incorpore dados relacionadosO aplicação sempre leia e atualiza os dados relacionados ao mesmo tempo. Esta solução simplifica seu esquema e evita a necessidade de operações $lookup .
Triggers de banco de dadosSeu aplicativo pode tolerar a leitura de dados ligeiramente obsoletos. Os usuários podem ver dados desatualizados se executarem uma query imediatamente após uma atualização, mas antes que o trigger termine de atualizar a segunda coleção.

Nota: Saiba mais sobre coerência de dados.


Isolamento

Cada transação é isolada das outras transações para evitar conflitos de dados. Isso também ajuda as operações de banco de dados em relação ao gerenciamento de várias entradas e transações de vários níveis. Por exemplo, se dois usuários estiverem tentando modificar os mesmos dados (ou até mesmo a mesma transação), o DBMS usará um mecanismo chamado de gerenciador de bloqueio para interromper outros usuários até que as alterações que estão sendo feitas pelo primeiro usuário estejam completas.


Como o MongoDB lida com isolamento:

O MongoDB emprega uma técnica chamada isolamento de snapshot (por exemplo, cada transação parece operar em um snapshot pessoal do banco de dados obtido no início da transação). As transações podem ler dados do “snapshot“ dos dados confirmados no momento em que a transação começa, e quaisquer atualizações conflitantes farão com que a transação seja interrompido.

Além disso, as transações MongoDB apoiam uma preocupação de leitura no nível da transação e preocupação de gravação no nível da transação. Os clientes podem definir um nível apropriado de preocupação de gravação, sendo o mais rigoroso a preocupação de leitura do snapshot combinada com a preocupação de gravação maioria. A preocupação de gravação maioria significa que as operações de gravação foram consolidadas de forma contínua com uma maioria calculada dos nós com dados (configurados pelo desenvolvedor).


Durabilidade

A durabilidade garante que, uma vez que a transação seja concluída e as alterações sejam gravadas no banco de dados, elas serão persistidas. Isso garante que os dados no sistema persistam mesmo em caso de falhas do sistema, como falhas ou interrupções de energia. O conceito de durabilidade é um elemento-chave na confiabilidade dos dados.


Como o MongoDB lida com a durabilidade:

O MongoDB cria um OpLog contendo a localização do disco e os bytes alterados para cada “gravação“. Se houver um evento imprevisto (por exemplo, uma interrupção) durante a gravação da transação, o OpLog poderá ser usado quando o sistema iniciar novamente para reprodução de quaisquer gravações que não tenham sido liberadas para o disco antes do isolamento. Além disso, as operações são alteradas antes de gravadas no OpLog para que sejam idempotentes e possam ser repetidas várias vezes. As transações, ou “gravações“, são liberadas em disco aproximadamente a cada 60 segundos por padrão.

Por que as transações ACID são importantes?

As transações ACID ajudam a manter a integridade e a confiabilidade dos dados, ao mesmo tempo em que garantem que os dados vitais que estejam sujeitos à regulamentação governamental ou do setor (por exemplo, conta bancária, portfólio de ações) atendam aos padrões exigidos. Além disso, ACID compliance geralmente é um pré-requisito para implementar a replicação de dados e alcançar alta disponibilidade em sistemas de banco de dados de dados distribuídos.

exemplo de transação ACID no DBMS

Usando o banco de dados de documentos MongoDB Atlas, aqui está um exemplo de como as transações ACID de vários documentos são tratadas e como as transações ACID garantem alinhamento com padrões mínimos de propriedade ACID.

Transações multidocumentos ACID

Imagine que você está criando uma função para transferir dinheiro de uma conta bancária para outra, em que cada conta é seu próprio registro. Se o dinheiro for obtido com sucesso da conta de origem, mas nunca créditodo na conta de destino, um grave problema de contabilidade foi criado. Por outro lado, se a conta de destino for créditoda, mas a conta de origem nunca for dedata, outro problema grave de contabilidade ocorrer.


Diagrama mostrando como as propriedades ACID impacto o fluxo de transferência de dinheiro de uma conta bancária para outra. The O diagrama demonstra como as propriedades ACID impacto o fluxo de transferência de dinheiro de uma conta bancária para outra.


Essas duas operações de gravação precisam acontecer ou não acontecer para manter o sistema e seus dados consistentes. Além disso, isso significa que se qualquer comando na transação falhar, o banco de dados de dados deve voltar atrás (por exemplo, desfazer) todas as mudanças que tinha gravado no decurso da transação.


código do Github em parceria com o MongoDB

Note: para saber mais, acesse o Node.js Repositório do Github de início rápido para obter uma cópia da amostra de código completa e execute-a você mesmo.


Impactos para lembrar

Ao lidar com transações multidocumento em um sistema distribuído, tenha em mente que há um impacto de sobrecarga de desempenho que pode afetar restrições de recursos e metas de desempenho. Além disso, como o banco de dados de dados precisa “bloqueio“ os recursos envolvidos para evitar que gravações simultâneas interfiram umas nas outras (por exemplo, falha na transação), outros clientes que estejam tentando gravar dados podem ficar parados aguardando a conclusão da transação, o que pode impacto a latência do aplicação e experiência do usuário.

Como as transações ACID funcionam no MongoDB?

O modelo de documento do MongoDB permite que dados relacionados sejam armazenados juntos em um único documento. O modelo de documento, combinado com atualizações de documento atômicas, elimina a necessidade de transações na maioria dos casos de uso. No entanto, há casos em que verdadeiras transações do MongoDB com vários documentos e multicoleções são a melhor escolha.

As transações do MongoDB funcionam de forma semelhante às transações em outros bancos de dados. Para usar uma transação, inicie uma sessão do MongoDB por meio de um driver. Em seguida, use essa sessão para executar seu grupo de operações de banco de dados. Você pode executar qualquer uma das operações CRUD (criar, ler, atualizar e excluir) em vários documentos, coleções e fragmentos.

Para obter amostras de código específicas de como implementar transações, consulte os Inícios rápidos no MongoDB Developer Center:

Acesse a documentação de drivers do MongoDB para guias específicos de idioma para cada um dos idiomas oficialmente suportados pelo MongoDB. Você também pode visualizar uma lista de práticas recomendadas de transações e considerações de produção.

Quando posso usar transações multidocumento do MongoDB?

Os aplicativos que exigem transações normalmente têm casos de uso em que valores são trocados entre diferentes partes. Esses são normalmente aplicativos do "Sistema de Registro" ou da "Linha de negócios".

Os exemplos de aplicações que podem se beneficiar de transações com vários documentos incluem:

  • Sistemas que movimentam fundos de uma conta para outra (por exemplo, aplicações bancárias, sistemas de processamento de pagamentos, plataformas de negociação).

  • Cadeia de suprimentos e sistemas de reserva onde a propriedade de bens e serviços é transferida de uma parte para outra.

  • Sistemas de faturamento que armazenam informações em registros detalhados, bem como registros resumidos.

Quais são as melhores práticas para transações no MongoDB?

Em geral, é recomendado modelar os dados de modo que os dados acessados juntos sejam armazenados juntos. Quando os dados são modelados dessa maneira, não apenas um melhor desempenho será alcançado, mas também não serão necessárias transações.

Para aplicativos que exigem transações, siga estas práticas recomendadas:

  • Faça transações de longa duração em partes menores para que não exceam o tempo limite padrão de 60 segundos. (Observe que esse tempo limite pode ser estendido.) Garanta que as operações em transações estejam usando índices para que sejam executadas rapidamente.

  • Limita cada transação a 1.000 modificações de documento .

  • Garanta que as preocupações de leitura e gravação apropriadas sejam configuradas (observe que a partir da versão 5.0, o MongoDB considera a preocupação de gravação da maioria necessária).

  • Adicione tratamento de erro apropriado e repita transações que falham devido a erros transitórios.

  • Lembre-se do custo de desempenho das transações que afetam vários fragmentos. Para obter mais informações sobre essas práticas recomendadas, consulte o artigo técnico ACID Transactions com vários documentos no MongoDB, bem como a documentação do MongoDB sobre transações.

Próximos passos

Pronto para saber mais? O MongoDB Atlas é o banco de banco de dados totalmente gerenciado do MongoDB como um serviço e é a maneira mais fácil de começar a usar o MongoDB. Comece com transações criando um cluster do MongoDB Atlas cluster MongoDB Atlas gratuito.

Perguntas frequentes

O que são transações multidocumento?

Uma transação multidocumento, às vezes chamada de transação distribuída, consiste em múltiplas transações interdependências espalhadas por diferentes bancos de dados e sistemas.

O que são transações ACID?

Uma transação ACID é um conjunto de operações em um sistema de banco de dados de dados que está em alinhamento com as propriedades ACID.

Quais são as propriedades ACID de uma transação?

As quatro propriedades principais ACID são automatização, consistência, isolamento e resiliência.