Concorrencia

Oi Pessoal!

Há um tempo atrás tive um problema de concorrência em uma aplicação de pagamento.
Acontece que todo o processamento era online, mas se houvesse mais de um pagamento para o mesmo cliente o saldo não era atualizado corretamente.

Para resolver esse problema, decidi usar filas. Mas até hoje penso qual seria a outra solução viavel para esse problema.

Na altura fiz um teste usando Syncronized o que não deu certo, nos teste de carga ainda assim o saldo era atualizado incorretamente muito raramente mas acontecia.

Gostaria de saber da experiencia de vocês e como resolvem problemas de concorrencia em aplicação web.

Isso ta mais pra bug, fila pode ser uma complexidade desnecessária nesse caso. Dá uma lida sobre transação em banco de dados.

O que o banco de dados tem haver nessa situação ? O processo esta sendo executado no mesmo tempo, alem de atualizar saldo outros processos são feitos.

Pensa, dois processos ao mesmo tempo, antes de persistir o outro processo obtém o valor desatualizado. Um sobrescreve o outro.

O banco de dados pode tratar concorrência. Nesse caso com lock pessimista.

Essa solução seria performática em um sistema de pagamentos que executa milhares de transações por dia?

Pela minha experiência em sistemas usando Oracle sim, outros bancos não sei informar.

Na minha singela opinião o melhor modo é criar procedure ou function no banco de dados;

Pra mim, vejo como uma excelente solução, pois não bloqueia a execução da ação e pode ser monitorada.

Realmente, dependendo da quantidade de instâncias que estão sendo executadas, não iria funcionar muito bem.

1 curtida

Lucas,

Você vê alguma outra solução que resolva essa questão de forma descente ?

Em design patterns não existe um ou outro padrão correto, é bom mesclar.