Pular para o conteúdo

Transações no banco: quando duas operações precisam acontecer juntas

O pedido foi criado, mas o estoque não baixou. O pagamento foi registrado, mas o pedido ficou pendente. Transações evitam esses estados pela metade.

Por Equipe We Codex3 min de leitura

Muitas operações de negócio envolvem várias gravações: criar o pedido, baixar o estoque, registrar o pagamento. Se o sistema falhar no meio, os dados ficam inconsistentes — e alguém vai precisar descobrir e corrigir manualmente.

O que uma transação garante

Que um conjunto de operações acontece por inteiro ou não acontece. Se qualquer passo falhar, tudo é desfeito.

ts
await db.$transaction(async (tx) => {
  const pedido = await tx.pedido.create({ data: novoPedido })
  await tx.estoque.update({ where: { produtoId }, data: { quantidade: { decrement: qtd } } })
  await tx.movimento.create({ data: { pedidoId: pedido.id, tipo: 'SAIDA', qtd } })
})

Concorrência

Duas pessoas comprando o último item ao mesmo tempo: sem cuidado, ambas conseguem. Restrições no banco (estoque não pode ser negativo), bloqueios de linha ou verificações atômicas resolvem.

O que não colocar dentro da transação

Entre sistemas diferentes

Quando a operação envolve dois sistemas (seu banco e o ERP), não há transação única. Usa-se compensação: se o segundo passo falha, o primeiro é desfeito por uma ação contrária (Integrando seu sistema com o ERP: as armadilhas mais comuns).

A escolha do banco influencia o suporte a transações (PostgreSQL ou MongoDB: como escolher sem modismo).

A We Codex constrói sistemas consistentes em sistemas web e e-commerces. Fale com a gente.

  • Banco de dados
  • Transações
  • Consistência
  • Backend
CompartilharWhatsAppLinkedIn

Resolver de vez, com quem faz isso todo dia

Precisa de uma API ou integração que não caia quando o negócio crescer?

Este artigo mostra o caminho. A implementação sob medida — o detalhe que muda o resultado no seu caso — é o trabalho da We Codex, empresa de engenharia do grupo Wocom.