A geração de um aplicativo Web pronto para produção exige que você garanta que ele seja seguro e escalável.


Uma das coisas mais importantes a saber sobre bancos de dados é o princípio ACID, que significa atomicidade, consistência, isolamento e duração. Bancos de dados relacionais porquê MySQL suportam transações ACID nativamente. Mas o MongoDB é um banco de dados NoSQL e não suporta transações ACID por padrão.

Porquê programador, você deve saber porquê introduzir propriedades ACID em seus bancos de dados MongoDB.


O que são transações de banco de dados?

Uma transação de banco de dados é uma sequência de consultas ou operações de banco de dados que são executadas juntas porquê uma unidade para concluir uma tarefa.

As transações de banco de dados seguem os conceitos de características ACID. Isso ajuda a prometer que nenhuma diferença ocorra, a menos que todas as operações sejam bem-sucedidas. Também garante que o banco de dados seja consistente.

As propriedades do ácido explicadas

As quatro propriedades que compõem os princípios ACID são:

  • Atomicidade é a propriedade que conceitua transações porquê pequenas unidades de um programa. Isso implica que todas as consultas são executadas com vitória ou falham juntas.
  • Consistência afirma que os registros do banco de dados devem permanecer consistentes antes e depois de cada transação.
  • Isolamento garante que, quando várias transações são executadas simultaneamente, uma não afeta a outra.
  • Duração concentra-se em falhas ou falhas do sistema. Ele garante que uma transação confirmada não seja perdida em caso de lapso do sistema. Isso pode envolver técnicas necessárias para restaurar dados de um backup involuntariamente mal o sistema for reativado.

Porquê implementar transações de banco de dados MongoDB no Node.js usando o Mongoose

O MongoDB tornou-se uma tecnologia de banco de dados amplamente utilizada ao longo dos anos devido à sua natureza NoSQL e padrão maleável fundamentado em documentos. Ele também oferece a capacidade de organizar melhor seus dados e com mais flexibilidade do que em bancos de dados SQL ou relacionais.

Para implementar transações de banco de dados no MongoDB, você pode considerar um cenário de exemplo em um aplicativo de lista de empregos em que um usuário pode postar, atualizar ou excluir um trabalho. Cá está um design simples de esquema de banco de dados para levante aplicativo:

Diagrama de esquema para coleções de usuários e trabalhos

Para escoltar, esta seção requer conhecimento capital de programação Node.js e MongoDB.

Depois de configurar um projeto Node.js e MongoDB em funcionamento, você pode configurar uma conexão com um banco de dados Mongo no Node.js. Se você ainda não o fez, instale o mangusto executando npm instalar mangusto em seu terminal.

import mongoose from 'mongoose'

let MONGO_URL = process.env.MONGO_URL || 'your-mongo-database-url';

let connection;
const connectDb = async () => {
try {
await mongoose.connect(MONGO_URL, {
useNewUrlParser: true,
useUnifiedTopology: true,
});

console.log("CONNECTED TO DATABASE");
connection = mongoose.connection;
} catch (err) {
console.error("DATABASE CONNECTION FAILED!");
console.error(err.message);
process.exit(1);
}
};

Você deve armazenar a conexão em uma variável para poder usá-la para iniciar uma transação posteriormente no programa.

Você pode implementar as coleções de usuários e trabalhos da seguinte forma:

const userSchema = new mongoose.Schema({
name: String,
email: String,
jobs: [mongoose.Schema.Types.ObjectId]
});

const jobSchema = new mongoose.Schema({
title: String,
location: String,
salary: String,
poster: mongoose.Schema.Types.ObjectId
});

const userCollection = mongoose.model('user', userSchema);
const jobCollection = mongoose.model('job', jobSchema);

Você pode ortografar uma função para somar um usuário ao banco de dados assim:


const createUser = async (user) => {
const newUser = await userCollection.create(user);
console.log("User added to database");
console.log(newUser);
}

O código aquém demonstra a função para fabricar um trabalho e adicioná-lo à lista de trabalhos de seu pôster usando uma transação de banco de dados.


const createJob = async (job) => {
const { userEmail, title, location, salary } = job;


const user = await userCollection.findOne({ email: userEmail });


const session = await connection.startSession();


try {
await session.startTransaction();


const newJob = await jobCollection.create(
[
{
title,
location,
salary,
poster: user._id,
},
],
{ session }
);
console.log("Created new job successfully!");
console.log(newJob[0]);


const newJobId = newJob[0]._id;
const addedToUser = await userCollection.findByIdAndUpdate(
user._id,
{ $addToSet: { jobs: newJobId } },
{ session }
);

console.log("Successfully added job to user's jobs list");
console.log(addedToUser);

await session.commitTransaction();

console.log("Successfully carried out DB transaction");
} catch (e) {
console.error(e);
console.log("Failed to complete database operations");
await session.abortTransaction();
} finally {
await session.endSession();
console.log("Ended transaction session");
}
};

UMA crio consulta que é executada em uma transação geralmente recebe e retorna uma matriz. Você pode ver isso no código supra, onde ele cria novo ocupação e armazena seus _Eu iria propriedade no novoJobId variável.

Cá está uma prova de porquê as funções supra funcionam:

const mockUser = {
name: "Timmy Omolana",
email: "jobposter@example.com",
};

const mockJob = {
title: "Sales Manager",
location: "Lagos, Nigeria",
salary: "$40,000",
userEmail: "jobposter@example.com",
};

const startServer = async () => {
await connectDb();
await createUser(mockUser);
await createJob(mockJob);
};

startServer()
.then()
.catch((err) => console.log(err));

Se você salvar levante código e executá-lo usando npm início ou o comando, ele deve produzir uma saída porquê esta:

saída de transações do banco de dados

Outra maneira de implementar transações ACID no MongoDB usando o Mongoose é usando o comTransação() função. Essa abordagem oferece pouca flexibilidade, pois executa todas as consultas dentro de uma função de retorno de chamada que você passa porquê argumento para a função.

Você pode refatorar a transação de banco de dados supra para usar comTransação() assim:

const createJob = async (job) => {
const { userEmail, title, location, salary } = job;


const user = await userCollection.findOne({ email: userEmail });


const session = await connection.startSession();


try {
const transactionSuccess = await session.withTransaction(async () => {
const newJob = await jobCollection.create(
[
{
title,
location,
salary,
poster: user._id,
},
],
{ session }
);

console.log("Created new job successfully!");
console.log(newJob[0]);


const newJobId = newJob[0]._id;
const addedToUser = await userCollection.findByIdAndUpdate(
user._id,
{ $addToSet: { jobs: newJobId } },
{ session }
);

console.log("Successfully added job to user's jobs list");
console.log(addedToUser);
});

if (transactionSuccess) {
console.log("Successfully carried out DB transaction");
} else {
console.log("Transaction failed");
}
} catch (e) {
console.error(e);
console.log("Failed to complete database operations");
} finally {
await session.endSession();
console.log("Ended transaction session");
}
};

Isso produziria a mesma saída que a implementação anterior. Você é livre para escolher qual estilo usar ao implementar transações de banco de dados no MongoDB.

Esta implementação não usa o commitTransaction() e abortTransaction() funções. Isto porque o comTransação() A função confirma involuntariamente as transações bem-sucedidas e aborta as que falharam. A única função que você deve invocar em todos os casos é a session.endSession() função.

Implementando transações de banco de dados ACID no MongoDB

As transações de banco de dados são fáceis de usar quando feitas corretamente. Agora você deve entender porquê as transações de banco de dados funcionam no MongoDB e porquê você pode implementá-las em aplicativos Node.js.

Para explorar ainda mais a teoria de transações ACID e porquê elas funcionam no MongoDB, considere edificar uma carteira fintech ou um aplicativo de blog.

Leave a Reply

Your email address will not be published. Required fields are marked *