Marcio Cunha

Estratégias de Concorrência Otimista e Controle de Versão em Bancos de Dados Relacionais

Descubra como lidar com milhares de acessos simultâneos em bancos de dados relacionais sem travar linhas inteiras, utilizando colunas de versão e controle otimista.

Marcio Cunha•3 min
Também disponível em:EnglishEspañol
Resumo
  • O bloqueio pessimista tradicional trava o registro na tabela, impedindo outras transações até a liberação e criando gargalos severos de desempenho.
  • A concorrência otimista assume que conflitos são raros, permitindo que leituras e alterações ocorram livremente até a etapa final de gravação.
  • Colunas de versão ou carimbos de data e hora funcionam como contadores que invalidam atualizações caso outro processo tenha modificado o dado no meio do caminho.
  • Sistemas de alta vazão se beneficiam enormemente dessa abordagem porque reduzem drasticamente o tempo de espera e o consumo de conexões ativas.
  • Tratar falhas de concorrência com novas tentativas automáticas garante robustez sem sacrificar a experiência do usuário final.

O Desafio da Concorrência em Sistemas de Alta Vazão

Quando milhares de pessoas tentam comprar o mesmo ingresso para um show ou atualizar seus dados cadastrais exatamente no mesmo segundo, o banco de dados sofre uma pressão imensa. Se cada clique travar a linha correspondente para impedir que outra pessoa altere o registro, o sistema inteiro desacelera. Na prática, isso significa filas intermináveis de requisições esperando a vez de falar com o disco rígido, derrubando a performance geral da aplicação.

Para resolver esse gargalo sem corromper as informações, os engenheiros precisam escolher entre diferentes estratégias de isolamento. O bloqueio pessimista, por exemplo, é como trancar a porta de um escritório por dentro enquanto você trabalha; ninguém mais entra até você sair. Já a concorrência otimista funciona como uma mesa compartilhada onde todos trabalham livremente, verificando apenas no final se alguém mexeu no seu documento antes de enviá-lo para o arquivo definitivo.

Como Funciona o Controle Baseado em Versões

A concorrência otimista elimina a necessidade de travar registros durante as leituras e edições intermediárias. Para isso, a tabela do banco de dados ganha uma coluna extra chamada comumente de versao ou version, que armazena um número inteiro. Na prática, toda vez que um registro é lido pela aplicação, essa versão atual é guardada na memória junto com os dados do usuário.

Quando o usuário clica em salvar, o sistema envia de volta os dados alterados e o número da versão que ele leu lá no começo. O comando SQL de atualização verifica se a versão armazenada no banco ainda é exatamente igual àquela que a aplicação trouxe. Se o número mudou, significa que outra transação foi mais rápida e alterou o registro nesse meio tempo, disparando um sinal de alerta para evitar que dados legítimos sejam sobrescritos silenciosamente.

Implementando a Atualização Segura com Código

Para visualizar essa dinâmica na prática, imagine um sistema de estoque onde o saldo de um produto precisa ser atualizado com segurança. A consulta inicial lê o saldo atual e o número da versão, e a alteração subsequente valida esse estado antes de confirmar a gravação definitiva no banco de dados relacional.

UPDATE produtosSET quantidade = 42,versao = versao + 1Onde id = 101 E versao = 5;

Se nenhum outro processo alterou o produto de ID 101 enquanto o usuário editava, a linha com versao igual a 5 será encontrada, o saldo será atualizado para 42, e o contador de versão subirá para 6. Se o comando retornar zero linhas afetadas, significa que a versão mudou e o sistema sabe que ocorreu um conflito de concorrência, exigindo uma nova leitura dos dados.

Trade-offs e Estratégias de Tratamento de Conflitos

A principal vantagem da concorrência otimista é a escalabilidade, pois o banco de dados não mantém conexões bloqueadas por longos períodos. No entanto, o custo dessa liberdade aparece quando ocorrem conflitos frequentes. Na prática, se cem pessoas tentarem atualizar o mesmo registro no mesmo milissegundo, noventa e nove falharão na primeira tentativa e precisarão tentar de novo.

Por causa disso, essa estratégia brilha em cenários de alta leitura e baixa taxa de escrita simultânea no mesmo registro, como perfis de usuários ou catálogos de produtos. Quando os conflitos são inevitáveis, a aplicação precisa implementar rotinas de repetição automática ou estratégias de mesclagem para que o usuário não perceba o atrito por trás das cortinas.

Considerações Finais sobre Escalabilidade Relacional

Adotar o controle otimista de versão exige uma mudança de mentalidade na engenharia de software, transferindo parte da responsabilidade de consistência do banco de dados para a lógica da aplicação. Embora exija tratamento adequado de exceções e novas tentativas, o ganho de desempenho compensa amplamente o esforço de implementação. Ao evitar bloqueios desnecessários, sua aplicação consegue atender a uma quantidade massiva de usuários simultâneos mantendo a integridade dos dados intacta.