Modelagem de dados e consistência em sistema de reservas concorrentes
Um sistema de reserva de salas de coworking permite que múltiplos usuários reservem a mesma sala em horários distintos. O banco relacional armazena reservas com sala_id, inicio, fim. Durante testes de carga com 200 usuários simultâneos, surgiram duas reservas sobrepostas para a mesma sala no mesmo horário. A verificação de conflito é feita na aplicação: ela consulta se há sobreposição e, se não houver, insere a reserva. O intervalo entre consulta e inserção é de cerca de 300 ms sob carga. O time sugere apenas adicionar um índice em sala_id para resolver o problema. O sistema precisa garantir que nunca existam reservas sobrepostas.
1. Explique por que o índice proposto não resolve o problema e qual é a causa raiz da inconsistência.
Read the worked answer
O índice em sala_id acelera a busca, mas não impede inserções concorrentes conflitantes. A causa raiz é uma condição de corrida (check-then-act): duas transações consultam a ausência de sobreposição antes de qualquer inserção ser confirmada e ambas inserem - fenômeno conhecido como phantom read/write skew.
O índice apenas melhora o desempenho da consulta; a janela de 300 ms entre verificação e inserção permanece, e o banco não tem regra que rejeite a sobreposição. Portanto, a integridade não é garantida no nível dos dados.
2. Proponha uma solução que garanta a invariante 'sem reservas sobrepostas' e discuta o impacto em concorrência.
Read the worked answer
Solução: garantir a invariante no banco de dados.
Opções:
- Bloqueio/transação serializável: executar verificação e inserção na mesma transação com nível de isolamento serializável ou
SELECT ... FOR UPDATEsobre a sala; o segundo usuário aguarda e então detecta o conflito. - Restrição de exclusão no PostgreSQL:
EXCLUDE USING gist (sala_id WITH =, tsrange(inicio, fim) WITH &&), que rejeita fisicamente qualquer sobreposição. - Particionamento por faixa de horário com bloqueio por recurso (lock por
sala_id), reduzindo contenção.
Impacto em concorrência: bloqueios por sala serializam apenas reservas da mesma sala em horários próximos; salas distintas seguem paralelas. Deve-se tratar o erro de conflito na aplicação, exibindo mensagem ao usuário e permitindo nova tentativa. A solução transfere a garantia para o SGBD, eliminando a dependência da lógica da aplicação.