Viviane.
Voltar ao blog
Backend

Controle de concorrência em venda de ingressos

Como o Ticket Sales evita overselling com transações MySQL e histórico de status.

8 min de leitura
  • Node.js
  • MySQL
  • Transações
  • Concorrência

O desafio do Ticket Sales

Vender ingressos online é um problema clássico de concorrência: duas pessoas podem tentar comprar o último assento ao mesmo tempo.

No Ticket Sales, implementei reserva temporária, compra em lote e cancelamento com histórico completo de status.

Reserva com expiração

Ao reservar, o sistema bloqueia o ingresso por alguns minutos. Se o pagamento não confirmar, a reserva expira e o assento volta ao estoque disponível.

Transações no MySQL

A compra executa dentro de uma transação com SELECT ... FOR UPDATE na linha do ingresso, garantindo que apenas uma sessão consiga confirmar a venda.

sql
START TRANSACTION;
SELECT available FROM tickets WHERE id = ? FOR UPDATE;
UPDATE tickets SET status = 'SOLD' WHERE id = ? AND available > 0;
INSERT INTO orders (...);
COMMIT;

Histórico de status

Cada mudança — RESERVED, PAID, CANCELLED — é registrada em tabela de auditoria. Isso facilitou debug e testes com Vitest cobrindo cenários de corrida.

  • Testes de concorrência com Vitest
  • Swagger documentando fluxos de reserva e compra
  • Deploy na Render com health check