1
resposta

[Dúvida] Implementação transaction

Gostaria de saber se esta implementação de transacao manual está correta?

Controller.js

async criaNovo(req, res) {
    const transacao = await sequelize.transaction();
    const dadosParaCriacao = req.body;
    try {
      const novoRegistroCriado = await this.entidadeService.criaRegistro(dadosParaCriacao, transacao);
      await transacao.commit();
      return res.status(200).json(novoRegistroCriado);
    } catch (erro) {
      await transacao.rollback();
      return res.status(500).json({ erro: erro.message });
    }
  }

Service.js:

async criaRegistro(dadosDoRegistro, transacao) {
  return dataSource[this.model].create(dadosDoRegistro, {transaction: transacao});
}

Só fiz essa modificações dentre todos os arquivos. Isso está correto e bem estruturado?

1 resposta

Sua implementação de transação manual está correta e bem estruturada. A transação é criada no controller, e você passa ela para o serviço ao criar o registro. Uma pequena melhoria seria adicionar um bloco "finally" para garantir que a transação seja sempre tratada corretamente, mesmo em casos de falhas inesperadas. Fora isso, está tudo certo!

Exemplos

Controller.js:

async criaNovo(req, res) {
  const transacao = await sequelize.transaction();
  const dadosParaCriacao = req.body;
  try {
    const novoRegistroCriado = await this.entidadeService.criaRegistro(dadosParaCriacao, transacao);
    await transacao.commit();
    return res.status(200).json(novoRegistroCriado);
  } catch (erro) {
    await transacao.rollback();
    return res.status(500).json({ erro: erro.message });
  } finally {
    // Garantindo que a transação será encerrada corretamente
    // Mesmo que não seja estritamente necessário aqui, é uma boa prática.
    // Não é preciso fazer nada aqui, já que commit/rollback foram chamados no try/catch.
  }
}

Service.js:

async criaRegistro(dadosDoRegistro, transacao) {
  return dataSource[this.model].create(dadosDoRegistro, { transaction: transacao });
}

O bloco "finally" garante que a transação seja controlada corretamente. Embora, neste caso, você já esteja tratando o commit e rollback dentro do try-catch, usar o finally é uma boa prática para garantir que nada seja deixado para trás.

Espero tê-lo ajudado, bons estudos!