[firebase-br] Muitos Deadlock no banco

Marco Antonio Abreu mabreu.ti em gmail.com
Sáb Out 31 13:37:17 -03 2009


Marcelo,
Eu já tive de fazer algo parecido. Faz o seguinte:

- Cada processo deve ter um ID diferente para identifica-lo nas operações no
BD. Isso você pode obter criando um Generator e cada processo quando se
conectar no banco pega o próximo numero. Assim nunca repete nem tem igual.

- crie um campo na tabela de evento para servir de mutex.

- cada processo deve primeiro gravar o seu ID de processo no campo criado
antes de obter qual será o evento a ser tratado, algo como "UPDATE Evento
SET idprocesso = :idprocesso WHERE idevento =(SELECT MIN(idevento) FROM
Evento WHERE reservado = 1 AND idprocesso IS NULL) AND idprocesso IS NULL".
Os testes de "idprocesso IS NULL" são importantes para o BD pegar apenas os
que não estão sendo utilizados.

- depois pegue o evento pelo ID do processo, algo como "SELECT * FROM Evento
WHERE idprocesso = :idprocesso".

- caso o select não traga nada é pq o update falhou, tendo outro processo
pego a linha. Para resolver é só colocar o update e o select em um loop até
que o select retorne algo. O que deve sempre ocorrer de primeira.

- Não esqueça de abrir uma transação antes do update e dar commit após o
mesmo, para que as outras aplicações não possam interferir nesta operação,
mas possam ser liberadas logo após o seu commit.

- depois de terminar de operar com o evento marque-o como finalizado e limpe
o IDPROCESSO, setando NULL, algo como "UPDATE Evento SET idprocesso = NULL
WHERE idprocesso = :idprocesso".

Assim vc sempre vai ter uma única linha capturada para operação por processo
ativo.

abs,
Marco


2009/10/28 Marcelo Moreira <marcelomoreira.souza em gmail.com>

> Dougas,
>
> Tenho varios tipos de ventos como: enviar um email, retorno de contato,
> abertura de chamado, etc.
> Vou dar uma analisada na sua explicacao e ver o que eu faco.
> Realmente minha aplicacao esta ignorando os deadlock e passando para frente
> e foi por isso que perguntei se isso poderia trazer algum problema para o
> banco.
> obrigado pela atencao.
>
> 2009/10/28 Douglas Tosi <douglasht em gmail.com>
>
> > 2009/10/28 Marcelo Moreira <marcelomoreira.souza em gmail.com>:
> > > Para despachar estes eventos eu tenho 20 aplicativos clientes
> conectados
> > no
> > > banco e fazendo um select mais ou menos assim:
> >
> > Em casos de alta concorrência como este a aplicação tem que estar
> > preparada para tratar os deadlocks. No seu caso imagino que ela ignore
> > o evento lido e tente ler novamente. Os deadlocks em si não são o
> > problema. O banco está fazendo a parte dele.
> >
> > Se ainda assim você quiser evitar deadlocks, uma possível solução é
> > usar uma técnica de particionamento. Por exemplo, imagine que você tem
> > 20 desses processos que leem um evento e atualizam. Cada um é numerado
> > de 0 a 19 e passa esse número para o select em uma variável
> > id_processo. E imagine que o id_evento é um autoincremento. Você pode
> > fazer cada processo tratar um subconjunto diferente de dados incluindo
> > uma operação mod no where:
> >
> > ... and mod(EV.ID_EVENTO, 20) = :id_processo
> >
> > Impede os deadlocks, já que cada processo passa a ver apenas um
> > subconjunto dos dados, mas se um processo desses cair, vai começar a
> > acumular dados. Não sei se esta idéia se encaixa no que você está
> > fazendo, mas serve pra ilustrar que tem solução. Por que você usa 20
> > processos pra despachar os eventos? O que significa "despachar" os
> > eventos?
> >
> > hth,
> > --
> > Douglas Tosi
> > www.sinatica.com
> >
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > Para saber como gerenciar/excluir seu cadastro na lista, use:
> > http://www.firebase.com.br/fb/artigo.php?id=1107
> > Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> >
>
>
>
> --
> Marcelo Moreira
> (31) 8420-2723
> E-mail / MSN: marcelomoreira.souza em hotmail.com
> E-mail: marcelomoreira.souza em gmail.com
> Skype: marcelomoreira.souza
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



-- 
Marco Antonio Abreu
mabreu.ti em gmail.com
System Analist/Developer



Mais detalhes sobre a lista de discussão lista