Concorrência
Reservas simultâneas
- O problema
- Se dois clientes escolhem o mesmo horário ao mesmo tempo, conferir a disponibilidade e só depois gravar deixa espaço para as duas reservas passarem.
- A solução
- Cada reserva trava a linha do negócio com SELECT ... FOR UPDATE, confere o horário e grava na mesma transação. Além disso, uma restrição de exclusão no PostgreSQL impede intervalos sobrepostos, mesmo que algum caminho do código esqueça a trava.
- Detalhe
- Os testes de concorrência mostraram um deadlock entre inserções sobrepostas antes da trava existir. Com ela, o teste passa em 30 execuções seguidas.