ENADE Sistemas de Informação study materials
ENADE Sistemas de Informação study resources

Modelagem de dados e consistência em sistema de reservas concorrentes

ENADE Sistemas de Informação · Put your knowledge to work in context.

All case studies

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:

  1. 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 UPDATE sobre a sala; o segundo usuário aguarda e então detecta o conflito.
  2. Restrição de exclusão no PostgreSQL: EXCLUDE USING gist (sala_id WITH =, tsrange(inicio, fim) WITH &&), que rejeita fisicamente qualquer sobreposição.
  3. 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.