MongoDB e Node.js: Criar uma ACID transaction (parte 3 de 4)
Avalie esse Vídeo
00:00:00Introdução às transações do MongoDB
00:02:15Noções básicas sobre propriedades ACID
00:03:22Desconstruindo o Mito: o MongoDB Suporta Transações
00:04:17Quando usar transações no MongoDB
00:05:14Criando um Caso de Uso para Transações
00:06:10Configuração da implementação da transação
00:08:15Implementando transações no Node.js
00:10:38Criando funções de auxiliar para reserva
00:12:16Construindo a lógica de transação
00:14:42Execução e verificação da transação
00:16:41Lidando com o sucesso e o cancelamento da transação
00:18:15Testando a transação com cenários diferentes
00:20 38Conclusão do e qual é o próximo
O foco principal do vídeo é demonstrar como implementar e usar transações no MongoDB, especialmente com um aplicativo Node.js, para manter a integridade dos dados em vários documentos.
} Pontos-chave
- O MongoDB suporta transações ACID de vários documentos.
- As transações garantem que as operações sejam atômicas, consistentes, isoladas e duráveis.
- O vídeo fornece um exemplo prático do uso de transações em um script Node.js.
- A modelagem de dados no MongoDB geralmente reduz a necessidade de transações, mas elas estão disponíveis quando necessárias.
- A sessão inclui um guia passo a passo sobre como configurar e executar transações.
Links relacionados
- https://mdb.link/free-bdS03tgD2QQ
- https://mdb.link/community-bdS03tgD2QQ
- https:// youtu.be/fbYExfeFsI0
- https://youtu.be/iz37fDe1XoM
- https://developer.mongodb.com/quickstart/node-transactions
- https://github.com/mongodb-developer/nodejs-quickstart/blob/master/transaction.js
- https://github.com/mongodb-developer/nodejs-quickstart/blob/master/usersCollection.js
- https://github.com/mongodb-developer/nodejs-quickstart/blob/master/template.js
- https://docs.mongodb.com/manual/tutorial/convert-standalone-to-replica-set
- https://twitter.com/lauren_schaefer
- https://tiktok.com/@lauren_schaefer
- https://www.linkedin.com/in/laurenjan...
- https://developer.mongodb.com/community/forums/t/hey-names-im-lauren/168/
- https://bit.ly/3bpg1Z1
- https://bit.ly/2LjtNBZ
- https://bit.ly/3fH87gR
- https://bit.ly/3fEaIsd
- https://bit.ly/2SY9w90
- https://bit.ly/3bn9bDv
- https://bit.ly/2I8VCi5
- https://bit.ly/3fHoqdJ
Transcrição completa do vídeo
. .js agora se você preferir ler em vez de assistir a vídeos, eu deixei você coberta criei uma série de blogs que aborda exatamente o mesmo conteúdo que você me verá abordar hoje e deixará um link para você na descrição deste vídeo agora este é o terceiro vídeo da série de vídeos de início rápido do MongoDB e node.js no primeiro vídeo mostrei como nos conectar a um banco de dados MongoDB e, em seguida, como executar cada um dos que CRUD é criar operações de atualização de leitura e exclusão se você tiver alguma dúvida sobre como começar a usar o MongoDB e o node.js, recomendamos voltar ao primeiro vídeo no segundo vídeo Discuti os fundamentos do aggregation pipeline agora abaixo antes de a qualquer fu então vamos Go falar sobre o que ACID são transações ACID significa isolamento, consistência de atomicidade e durabilidade quando um banco ACID de dados suporta operações de propriedades têm a garantia de acontecer completamente ou não acontecer final com dados consistentes retornam os mesmos resultados quando executados simultaneamente com outras operações como fariam se executar sequencialmente e ser permanentemente escritos, o que significa que eles não serão perdidos no caso de um desligamento ou algo doido acontecer agora há um Mito flutuando de que o MongoDB não suporta transações e isso simplesmente não é verdade 4.0 a partir de Suporte adicionado do MongoDB para transações de ativos multidocumentos e começando em O MongoDB adicionou suporte para transações de ativos 4.2 distribuídas então se você precisar de uma transação não tenha temor que o MongoDB suporta transações vamos falar sobre como usar transações no MongoDB como você pode ter experimentado ao trabalhar com o MongoDB a maioria dos casos de uso na verdade, não exigem que você use transações com vários documentos ao modelar você r dados usando essa regra prática dados que são acessados juntos devem ser armazenados juntos você descobrirá que raramente precisa usar uma transação de fato, eu forcei um pouco para encontrar um caso de uso para o conjunto de dados do airbnb que realmente exigisse um transação multidocumento fez um pouco de troca de ideias e criei um exemplo um tanto verossímil, então digamos que queremos permitir que os usuários criem reservas no banco de dados de amostra do airbnb eu criei uma nova coleção usuários nomeados eu preciso de usuários para poder visualizar facilmente suas reservas quando eles visualizarem suas páginas de perfil de usuário, então eu gostaria de armazenar suas reservas como documentos incorporados na coleção de usuários, por exemplo, digamos que uma usuária chamada leslie crie duas reservas seu documento na coleção do usuário procurará assim ao navegar pelos anúncios do airbnb que os usuários precisam saber se o anúncio que estão visualizando já está reservado para as datas de viagem, portanto, queremos armazenar as datas em que o anúncio está reservado no lista de listagens e avaliações, por exemplo, a lista de visualizações infinitas que leslie reservou deve ser atualizada para listar suas datas de reserva manter essas duas coleções sincronizadas é fundamental se quisermos criar uma reserva em um documento na coleção do usuário sem atualizar o documento associado na coleção de anúncios e avaliações nossos dados seriam inconsistentes então podemos usar uma transação de vários documentos para garantir que ambas as atualizações sejam bem-sucedidas ou falhem juntas então vamos escrever um script node.js que usa transações para criar reservas para usuários vamos começar a configurar primeiro vamos Fale sobre seu banco de dados para utilizar transações O MongoDB deve ser configurado como um conjunto de réplicas ou um cluster fragmentado. As transações não são suportadas em sistemas standalone se você estiver usando um banco de dados hospedado no Atlas, que é o que vamos fazer hoje. Não precisa se preocupar com isso, pois cada Atlas cluster é um conjunto de réplicas ou um cluster baseado por padrão se você estiver hospedando seu próprio standa sistema único confira o link na descrição para obter instruções sobre como converter sua instância em um conjunto de réplicas vamos falar sobre os dados que estou usando um banco de dados hospedado no MongoDB Atlas e já carreguei esses dados de exemplo Definido lá hoje, continuarei trabalhando no banco de dados de amostra do airbnb usar a listagem do airbnb do Infiniteviews que criei no primeiro vídeo desta série, volte ao primeiro vídeo se o seu banco de dados não tiver o infinito no momento lista de visualizações o conjunto de dados de amostra do airbnb só tem as listagens na coleção de avaliações por padrão também preciso de uma coleção para armazenar meus usuários Escrevi um script que você pode usar para criar rapidamente essa VS Code coleção, então confira a descrição de um link para esse script está bem agora que estamos configurados vamos implementar a funcionalidade para criar reservas de airbnb eu estou passando para o agora estou começando aqui com um arquivo de modelo este modelo tem a mesma estrutura que o código e você me viu escrever nos últimos dois vídeos se tiver dúvidas sobre como esse arquivo de modelo está estruturado ou o que ele está fazendo. Volte para o primeiro vídeo. Começarei criando uma função auxiliar que gerará um documento de reserva para você Veremos como este documento é usado um pouco mais tarde, então vamos chamar essa função de criar documento de reserva ela terá três parâmetros então diremos nome da listagem as datas de reserva e os detalhes da reserva eu queremos que cada documento de reserva tenha um nome e datas então, vamos adicioná-los a uma variável chamada reserva, então direi que deixe a reserva ser igual a um novo objeto diremos que o nome está definido como o nome da listagem e as datas estão definidas como datas de reserva agora as reservas podem ter uma variedade de outros propriedades e podemos não saber quais são elas com antecedência, então o que posso fazer é apenas percorrer o parâmetro de detalhes da reserva e extrair todas as propriedades nele, então direi para deixar detalhes nos detalhes da reserva e depois estou vai para p ull a Go propriedade e atribuí-la à variável de reserva, então direi que reserva o detalhe é igual aos detalhes da reserva então depois de fazer o looping a reserva está pronta, eu só vamos devolvê-la para dar uma ideia do que é essa função fazendo, deixe-me mostrar um exemplo que eu estou usando para até o principal e eu 180 estou apenas para colar uma chamada para essa função, então isso significa criar um documento de reserva em que o nome da listagem seja infinito visualizações a reserva começará na Véspera de Ano Novo e terminará no Dia de Ano Novo e, em seguida, vários outros detalhes que são específicos da reserva, portanto, o preço por noite de para solicitações especiais que o convidado selecionou check-out atrasado e esta reserva vem com café da manhã incluído, então deixe-me executar isso e podemos ver que a função está retornando um documento bem formatado que representa essa reserva agora que temos nossa função de ajuda pronta, criaremos uma função cujo trabalho é realmente criar a reserva no banco de dados então vamos criar uma função assíncrona chamada criar reserva agora vamos falar de parâmetros a função deve aceitar um cliente [ __ ] endereço de e-mail do usuário o nome do airbnb listando as datas da reserva e quaisquer outros detalhes da reserva agora precisamos obter as coleções que vamos use nesta função, então primeiro vamos criar uma constante chamada user's collection e obteremos isso dizendo client.db exemplo de coleção de pontos do airbnb usuários e vamos fazer o mesmo com as coleções de listas e avaliações então diremos listas const e coleção de avaliações é igual a client.db exemplos de listagens e análises da coleção de pontos do airbnb agora vamos criar um documento para essa reserva, então vamos chamar a função auxiliar que criei há um momento e passar esses argumentos da função, então direi para criar o documento de reserva nome da listagem datas de reserva detalhes da reserva e vamos atribuir isso a uma constante chamada reserva tudo bem agora estamos prontos para começar a criar uma transação a cada transação e suas operações devem estar associadas a uma sessão A criação de uma sessão é bastante simples, então direi que a sessão const é igual à sessão inicial do ponto de cliente não é muito capciosa, então posso optar por definir opções para a transação e não Lambda vamos entrar em dos detalhes dessas opções aqui. Você pode aprender mais sobre essas opções na documentação do Lambda driver para este exemplo. meu código de transação pode lançar erros, então vamos criar um bloco try-catch uh, então vamos fazer uma tentativa de captura e, em seguida, vamos dar sequência a isso com um bloco finalmente. execute um e confirme ou interrompa a transação que eu chamaria de sessão.com a transação e preciso passar um , por enquanto vamos passar uma função assíncrona anônima que não faz nada ing, vamos adicionar mais informações a isso em um momento e também vamos passar as opções de transação que criei há um momento com a transação para retornar uma promessa, então seleciono a opção de aguardar os resultados e Vou atribuir os resultados a uma constante chamada resultado de transação essa função anônima para a qual estou passando com transação não faz nada no momento, então estou começando a construir de forma incremental as 1 operações de banco de dados que pretendo chamar de dentro dessa função tudo bem, então lembre-se de que queremos fazer atualizações em duas collections: a collection de usuários e a collection de listagens e avaliações, vamos começar fazendo uma atualização no documento apropriado na collection de usuários deseja adicionar uma reserva à array de reservas do usuário para que eu diremos aguardar a atualização do ponto de coleta de usuários e nós queremos o Atlas Search para o documento de usuário em que o e-mail está definido para o argumento de e-mail do usuário para a operação de atualização que eu gostaria de usar adicionar para definir para adicionar a reserva à lista de reservas ray agora preciso associar esta operação à transação por isso vamos passar a sessão vamos armazenar os resultados desta atualização em uma constante denominada users atualize os resultados double para nos ajudar a ver o que está acontece vai adicionar alguns registros aqui vamos registrar quantos documentos essa query encontrou então direi console.log usersupdatersults.matchedcount esses documentos foram encontrados na coleção do usuário com o e-mail do usuário e depois vamos registrar quantos documentos foram realmente atualizado, então direi console.log usersupdatersults.modifiedcounts documentos foram atualizados para incluir a reserva a seguir gostaria de ter certeza de que um anuário do airbnb não tenha uma reserva para uma determinada data, então vamos verificar se a data de registro é já listado nas listas datas matriz reservada então eu direi para aguardar as listas e avaliações da coleção ponto encontrar um e eu estou seguindo para o Atlas Procure um documento onde o nome está definido como nome da lista e onde qualquer uma das datas de reserva já está no campo datas reservadas, então direi datas reservadas dólar em datas de reserva assim como eu fez com a última query preciso passar a sessão vamos armazenar os resultados dessa query em uma constante chamada is listagem resulta de volta à atualização do documento de usuário que fizemos na query anterior agora adicionarei alguns registros apenas para maior clareza, então direi console dot air esta listagem já está reservada para pelo menos uma das datas fornecidas em que a reserva não pôde seja criado agora para realmente destacar esse ponto sobre o cancelamento de transações eu direi console.air todas as operações que já ocorreram como parte desta transação serão revertidas e então adicionarei uma devolução a ela e a última coisa que 1 queremos fazer dentro dessa transação é atualizar o documento na coleção de listagens e avaliações, gostaria de adicionar as datas de reserva à array de datas reservadas, então direi para aguardar a atualização do ponto de coleção de listagens e avaliações e eu preciso atualizar o documento onde o nome do argumento de listagem para a operação de 1 atualização que usarei add para definir eu quiser atualizar a array reservada de datas e adicionar cada data a partir do argumento de datas de reserva agora eu posso Esqueça-se de passar a sessão, é claro, vamos definir o resultado da chamada de atualização para uma constante chamada de resultados de atualização de listagens e avaliações é um pouco prolixo, mas espero que você esteja me seguindo vamos adicionar um pouco de registro aqui só para podermos rastreie o que está acontecer então primeiro vamos registrar quantos documentos correspondem à nossa query então direi console.log listagens e avaliações atualize resultados dot correspondido count documentos encontrados na coleção de listagens e avaliações com o nome nome da listagem e então vamos lo g quantos documentos foram realmente atualizados, então direi console.log listagens e avaliações atualizam resultados pontos de contagem modificados documentos foram ou foram atualizados para incluir as datas de reserva, então agora feito tudo o que queria fazer nesta transação documentos atualizados na coleção de usuários e na coleção de listagens e avaliações agora vamos rolar um pouco para cima lembrei que armazenei meus resultados de transação aqui em uma constante chamada resultados de transação para verificar se a transação foi bem-sucedida posso dizer se a transação resulta agora se os resultados da transação estiverem definidos, eu souber que a transação foi bem-sucedida, então direi apenas console.log, a reserva foi criada com êxito, caso contrário, o que significa que os resultados da transação estão indefinidos. abortado se algo der errado na minha transação um erro será lançado então dentro da minha captura direi console.log a transação foi abortada devido a um inesperado d e continuaremos esse erro lá, independentemente do que acontecer eu preciso encerrar a sessão, então dentro do bloco finalmente direi para aguardar sessão ponto final da sessão Escrevi muito código aqui, vamos tentar isso estou começando a criar uma reserva para leslie na lista de visualizações infinitas para a noite de ano novo e o dia de ano novo, então vamos rolar para cima até Maine e direi aguardo criação 2021 12 31 da reserva agora preciso passar 2022 0101 vários argumentos primeiro o cliente [ __ ] o próximo é o endereço de e-mail do usuário, então 180 direi leslie exemplo.com próximo preciso passar o nome da listagem então direi visualizações infinitas e então preciso passar uma array de datas então Criarei uma nova data para e uma nova data para e, finalmente, preciso passar quaisquer outros detalhes da reserva, então direi que o preço por noite é . há um pedido especial para check-out atrasado e para o café da manhã incluído eu direi verdadeiro tudo bem em salvar meu arquivo e vamos executá-lo bem temos muitas saídas aqui vejamos o que está a acontecer podemos ver que um documento foi encontrado na coleção do usuário com o endereço de e-mail leslie exemplo.com então nosso usuário existe isso é bom um documento foi atualizado para incluir a reserva que é boa então um documento foi encontrado na coleção de listagens e avaliações com o nome visualizações infinitos então achamos essa lista e um documento foi atualizado para incluir as datas de reserva a reserva foi criada com sucesso nossa transação funcionou, vamos dar uma olhada no documento de leslie aqui, podemos ver que ela tem a reserva que acabamos de criar para ela, vamos também dar uma olhada na lista de visualizações infinitas nas listas e avaliações, podemos ver que este documento também mostra que ele foi reservado nas datas que solicitamos agora, digamos que um usuário diferente tom tenta criar uma reserva no mesmo localização do airbnb nas mesmas datas só estou começando a atualizar o endereço de e-mail aqui para dizer tom exemplo.com Go e estou começando a executar esse script novamente aqui podemos ver que a transação foi abortada intencionalmente porque o anúncio já estava reservado podemos dê uma olhada no documento de tom e veja que ele não tem transação que foi bem-sucedida, bem como uma transação que foi abortada, tudo bem, vamos encerrar isso hoje conversamos sobre transações, discutemos o que são transações e escrevemos código para usar uma transação em um script node.js quando você usa bancos de dados relacionais, dados relacionados são comumente dividido entre tabelas diferentes em um esforço para normalizar os dados como resultado, o uso da transação é bastante comum quando você usa os dados do MongoDB que são acessados juntos devem ser armazenados toget ela quando você modelar seus dados dessa forma, você provavelmente descobrirá que raramente precisa usar transações, mas se precisar delas não se preocupar, o MongoDB suporta uma coisa a observar à medida que você começa a usar transações, certifique-se de estar usando a leitura e escrita corretas preocupações ao criar uma transação não entrarei em Github detalhes aqui, então confira a documentação do MongoDB para obter mais informações se quiser fazer referência ao código que me viu escrever hoje confira a série de blogs de início rápido que escrevi que cobre exatamente mesmo conteúdo, eu também tenho um repositório do que mostra apenas o código sem nenhuma explicação, então vai deixar links para ambos os que estão na descrição abaixo. Correrá bem que o último vídeo seja sobre change streams e Atlas Triggers nesse vídeo eu explicarei como você pode tomar ações automaticamente com base em alterações em seu banco de dados esse vídeo será lançado em breve, então certifique-se de apenas se inscrever para que você não pode perder se tiver alguma dúvida sobre transações ou sobre o MongoDB em geral. você ai você