Pular para o conteúdo

← Todos os projetos

Reserva de Quadras

concorrênciaNo ar

O que acontece se duas pessoas clicarem em “reservar” na mesma quadra, no mesmo horário, no mesmo instante?

A resposta intuitiva — consultar se está livre e então gravar — não resolve. Existe uma janela entre a consulta e a gravação, e dentro dela a outra requisição também consultou, também viu livre, e também vai gravar.

Lock otimista não serve, porque o conflito é entre linhas diferentes que se sobrepõem no tempo, não entre duas versões da mesma linha. Lock pessimista na quadra resolve, mas serializa até as reservas que não conflitam entre si. A garantia foi para o único lugar sem janela de corrida:

-- reservas não podem se sobrepor na mesma quadra
ALTER TABLE reservas ADD CONSTRAINT reservas_sem_sobreposicao
  EXCLUDE USING gist (
    quadra_id WITH =,
    tstzrange(inicio, fim, '[)') WITH &&
  ) WHERE (status <> 'CANCELADA');

Para não parar na afirmação, há um teste que dispara várias threads disputando o mesmo horário e verifica que exatamente uma reserva vence.

  • Java 21
  • Spring Boot 4
  • Spring Security
  • JWT
  • PostgreSQL
  • Testcontainers