Re: [firebase-br]Dúvida com transações

Henrique Netzka (Vetor Sistemas) henrique em vetorsistemas.com.br
Seg Out 16 17:43:16 -03 2006


Assim, pessoal... é uma dúvida, se alguém puder me responder.

Deadlock, em algum lugar na minha cabeça, é tido um processo esperando o 
outro terminar, mas o que nunca termina é porque está esperando o outro 
continuar. Um exemplo seria mais ou menos:

- Uma thread 1 está executando o procedimento A, que chama o procedimento B; 
porém, só pode chamá-lo se ninguém estiver executando-o.
- Uma thread 2 está executando o procedimento B.
- A thread 1 fica esperando a 2 terminar.
- Na thread 2 o procedimento B precisa executar o procedimento A; porém, a 
thread 1 já o executa!
- A thread 2 fica esperando 1 terminar.

Ou seja, uma espera a outra. Isso pra mim era deadlock!

Mas daí vocês estão discutindo a tabela de estoque. A tabela de estoque é 
uma só! Enquanto uma grava a outra espera; quando a uma acabar, a outra 
grava e pronto! Não há deadlocks nisso!

Com a pulga atrás da orelha, fui pesquisar, e daí me toquei em algo... 
Poderia acontecer um deadlock caso houvessem cascade updates, por exemplo, 
pois aí teríamos mais de 1 elemento-alvo de atualizações, e duas transações 
poderiam fazer operações em ordens diferentes em cima destes elementos-alvo, 
causando um deadlock. Exemplo:

- A transação 1 faz um UPDATE no estoque, e o UPDATE atualiza as informações 
de compra;
- A transação 2 está mexendo nas compras, fazendo com que a transação 1 
fique parada esperando.
- A transação 2, então, vai tentar mexer no estoque.
- Deadlock!

Agora... se você não tiver o caminho de volta (se o estoque não atualizar 
ninguém, apenas for atualizado), não há como ter deadlocks!!

Alguém entendeu o que eu quis dizer?! Se há algo de errado nessa teoria 
toda, alguém sabe me dizer o quê seria?!

De qualquer forma, eu quase concordo com o Marcos aí embaixo... Eu tenho uma 
tabela de estoques, porém ninguém mexe nela; tenho duas tabelas, uma de 
entrada e outra de saída, e nelas controlo o que entra e o que sai do 
estoque, gravando a informação no estoque através de triggers... Mas isso é 
denormalização do que o Marcos citou (pra não ter que usar o SUM toda vez), 
então é subjetivo ao ambiente...



----- Original Message ----- 
From: "Marcos Venicio Toledo" <marcosveniciotoledo em yahoo.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Monday, October 16, 2006 2:44 PM
Subject: Res: [firebase-br]Dúvida com transações


O Ideal para evitar todos os problemas eh o seguinte, nao armazenar a 
quantidade em estoque e sim, fazer inserçoes numa tabela de movimentacao, 
assim se o caixa a fizer e o b fizer na havera problemas. E quando vc 
precisar saber qto tem no estoque eh so fazer um select sum() e pegar o 
resultado.


Qualquer coisa envie um email


Obrigado

Marcos Venicio


----- Mensagem original ----
De: Magno System <magno em speet.com.br>
Para: FireBase <lista em firebase.com.br>
Enviadas: Quarta-feira, 11 de Outubro de 2006 13:04:32
Assunto: [firebase-br]Dúvida com transações


Pessoal, agradeço muito a ajuda de vocês mas fiz um teste e funcionou. Penso 
em tratar o deadlock direto do delphi. Veja abaixo:

procedure TForm1.Button1Click(Sender: TObject);
var
tentadenovo: boolean;
begin
ZConnection1.StartTransaction;
With ZStoredProc1 do
Begin
   parambyname('Codigo').AsInteger:=847;
   parambyname('Data').AsDate:=Date;
end;
tentadenovo:=true;
While Tentadenovo = true do
Begin
   Try
     ZStoredproc1.execproc;
     tentadenovo:=false;
   Except
      Begin
         tentadenovo:=TRUE;
         sleep(500);
      end;
   end;
end;
ZConnection1.commit;
Messagedlg('ok', mtwarning, [mbok], 0);
end;

Claro que é só um teste. Dá pra implementar algo como tempo-limite ou número 
de vezes máximo para tentar commitar e se estourar o tempo dá aviso ao 
usuário.
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço 
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa



_______________________________________________________
Novidade no Yahoo! Mail: receba alertas de novas mensagens no seu celular. 
Registre seu aparelho agora!
http://br.mobile.yahoo.com/mailalertas/

______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço 
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa 





Mais detalhes sobre a lista de discussão lista