Como trabalhar com transações no Sequelize?

Transações no Sequelize permitem agrupar várias operações de banco de dados em uma única unidade de trabalho, garantindo consistência e integridade dos dados.

Como trabalhar com transações no Sequelize?

Em sistemas de banco de dados, transações são essenciais para garantir que múltiplas operações sejam realizadas de maneira consistente e segura. O Sequelize, como um ORM para Node.js, oferece suporte completo para transações, permitindo que você agrupe várias operações e as execute como uma unidade atômica.

1. O que são transações?

Uma transação é um conjunto de operações de banco de dados que são executadas de maneira indivisível. Ou seja, ou todas as operações na transação são executadas com sucesso, ou nenhuma delas é executada. Transações são utilizadas para garantir que os dados não fiquem em um estado inconsistente.

2. Iniciando uma transação no Sequelize

No Sequelize, para trabalhar com transações, você deve usar o método transaction. Veja como iniciar uma transação no Sequelize:

const { Sequelize } = require('sequelize');

const sequelize = new Sequelize('meubanco', 'usuario', 'senha', {
    host: 'localhost',
    dialect: 'mysql',
});

sequelize.transaction((t) => {
    // Código para realizar operações dentro da transação
}).then(() => {
    console.log('Transação realizada com sucesso!');
}).catch((err) => {
    console.error('Erro ao realizar transação:', err);
});

O parâmetro t que é passado para o callback da transação representa a própria transação e deve ser passado como argumento para as operações do banco de dados dentro dessa transação.

3. Realizando operações dentro de uma transação

Dentro da transação, você pode realizar operações no banco de dados como inserir, atualizar ou excluir dados. Exemplo de como inserir dois registros dentro de uma transação:

sequelize.transaction((t) => {
    return Usuario.create({
        nome: 'Maria',
        email: 'maria@email.com',
    }, { transaction: t })
    .then(() => {
        return Pedido.create({
            usuarioId: 1,
            produto: 'Produto X',
        }, { transaction: t });
    });
}).then(() => {
    console.log('Dados inseridos com sucesso!');
}).catch((err) => {
    console.error('Erro ao realizar transação:', err);
});

Neste exemplo, estamos criando dois registros em tabelas diferentes dentro da mesma transação. Se alguma das operações falhar, nenhuma alteração será feita no banco de dados.

4. Commit e rollback

Se todas as operações dentro da transação forem bem-sucedidas, a transação pode ser commitada (confirmada), o que significa que as alterações serão salvas no banco de dados. Se ocorrer um erro em qualquer parte da transação, você pode desfazer todas as operações utilizando o rollback.

O Sequelize faz isso automaticamente se você chamar .catch() após a transação. Se você quiser fazer isso manualmente, use:

sequelize.transaction((t) => {
    return Usuario.create({
        nome: 'Carlos',
        email: 'carlos@email.com',
    }, { transaction: t }).then(() => {
        // Caso haja um erro, podemos forçar o rollback
        throw new Error('Erro na transação');
    }).catch((err) => {
        console.error('Erro no processo, realizando rollback:', err);
        t.rollback();
    });
});

Se você não passar t.rollback() explicitamente, o Sequelize fará isso automaticamente se a transação falhar.

5. Usando transações para consultar e atualizar dados

Você também pode usar transações para realizar consultas e atualizações complexas de maneira segura. Veja um exemplo de consulta e atualização dentro de uma transação:

sequelize.transaction(async (t) => {
    const usuario = await Usuario.findOne({ where: { id: 1 }, transaction: t });
    usuario.idade = 35;
    await usuario.save({ transaction: t });
}).then(() => {
    console.log('Transação concluída com sucesso!');
}).catch((err) => {
    console.error('Erro durante transação:', err);
});

Neste exemplo, estamos consultando um usuário e atualizando o campo idade dentro de uma transação.

6. Conclusão

As transações no Sequelize são uma maneira essencial de garantir que múltiplas operações de banco de dados sejam executadas de forma consistente e segura. Com o uso adequado de transações, você pode garantir que seu banco de dados permaneça em um estado íntegro, mesmo quando ocorrerem falhas. Lembre-se de sempre utilizar transações em cenários em que você esteja lidando com múltiplas alterações no banco de dados, como na criação de pedidos ou operações de pagamento.

As transações são fundamentais em sistemas que precisam garantir a consistência dos dados, principalmente em sistemas bancários ou e-commerce. Em um sistema de pagamento, por exemplo, se uma transação de pagamento for feita, mas o pedido não for registrado no banco de dados devido a uma falha, isso pode levar a inconsistências nos dados. O Sequelize facilita a implementação de transações, garantindo que o estado do banco de dados seja mantido de forma correta, mesmo em caso de erros.

Com o Sequelize, a execução de operações complexas dentro de transações se torna simples e segura, sendo uma ótima solução para projetos que exigem consistência no banco de dados.

Algumas aplicações:

  • Sistemas bancários e financeiros
  • Plataformas de e-commerce
  • Plataformas de pagamentos
  • Gestão de estoque e pedidos
  • Aplicações de registro de eventos críticos

Dicas para quem está começando

  • Utilize transações sempre que realizar múltiplas operações que dependem umas das outras.
  • Evite chamar transações com force: true em um ambiente de produção.
  • Verifique se todas as consultas dentro da transação estão usando o parâmetro transaction: t.
  • Certifique-se de fazer rollback quando ocorrerem erros durante a transação.
  • Testar transações em ambientes de desenvolvimento antes de utilizá-las em produção é essencial para evitar falhas.

Contribuições de Lucas Fernandes

Compartilhe este tutorial: Como trabalhar com transações no Sequelize?

Compartilhe este tutorial

Continue aprendendo:

Como modelar dados no MongoDB com Mongoose?

Mongoose é uma biblioteca poderosa que facilita a interação com o MongoDB no Node.js, permitindo a modelagem de dados e a execução de operações CRUD de forma simples.

Tutorial anterior

Como sincronizar modelos do Sequelize com o banco de dados?

Sincronizar modelos com o banco de dados no Sequelize é um passo importante para garantir que os esquemas e as tabelas estejam atualizados e consistentes com as mudanças no código.

Próximo tutorial