[firebase-br] Tabela de Alta Concorrência

Frederico Godoi frederico.godoi em gmail.com
Seg Jul 6 09:59:08 -03 2015


Srs, bom dia!

  Estou enfrentando um problema com uma tabela e meu banco de dados.
  Uma tabela "trava" literalmente. Claro que investigando mais fundo,
percebo que temos várias transações pendentes na tabela então a mesma para
de responder qualquer comando.

  Ela é uma tabela volátil, isto é, os dados dela são apenas aproveitados
hoje, no máximo amanhã para fazer uma nova listagem pra dentro dela. Ela
contém uma lista de pessoas que devem ser acionadas, ordenadas e com campos
para gravar quem é o usuário do sistema que está com aquele registro,
naquele momento.

  Para resolver a concorrência, nós fizemos no sistema ( delphi ) um SELECT
FIRST 1 SKIP 0 CAMPOCHAVE FROM TABELA WHERE PESSOA = NULL WITH LOCK

  Caso eu tenha um lock conflit eu faço SELECT FIRST 1 SKIP 1 .... e vou
incrementando esse SKIP para achar um registro livre.

   Assim que encontrar, eu faço o UPDATE setando o usuário que pegou aquele
registro, assim eu marco esse registro e já libero a transação também. Tudo
isso com try , bastante cuidado para não deixar transações pendentes e etc.

  Estamos falando de uma concorrência de aprox. 300 pessoas simultâneas
consumindo essa tabela e TAMBÉM pessoas fazendo novas listagens e fazendo
INSERT nessa tabela, para alimentar com mais dados.

  Em geral, não tenho nenhum problema. Agora com um cliente com esse volume
acima, pelo menos 1x ao dia estamos tendo esse problema de travamento.
Sabemos que não é o servidor porque trava especificamente essa tabela de
alta concorrência, quando trava, se fazemos commit de todas as transações
pendentes ela ainda fica travada. Fazemos DROP , recriamos a tabela e
alimentamos ela, tudo certo. Não há queda de performance em outras
pesquisas do banco de dados durante esses travamentos.

  Já pensamos em algo como, o usuário fazer um ctrl+alt+del durante a
transação, mas está pouco provável pelo tempo de intervalo que ele tem e
não conseguimos achar onde um usuário pode causar o travamento da tabela
toda, mas sim quando acontece uma pilha de problemas.

  Alguém poderia me dar uma ideia do que investigar? Alguma sugestão ?
Alguém já trabalhou com um problema de alta concorrência assim?


Obrigado !

-- 
Frederico Godoi



Mais detalhes sobre a lista de discussão lista