Deadlock
Tenho uma aplicação que grava em uma tabela de controle de apenas 1 registro, grava informações gerencias tais como nome da empresa, endereço, nro.de acessos, entrada e saída do sistema, nro.de usuários ativos etc, em um terminal apenas eu entro no programa e saio normal, quando outro terminal entra e eu vou sair da o DEADLOCK no post da rotina de gravação da query que eu faço atualização o que pode ser?????
Utilizo o Delphi 6 com o Interbase 6.
Utilizo o Delphi 6 com o Interbase 6.
Fernando Marroco
Curtidas 0
Respostas
Adilsond
07/10/2003
O deadlock está ocorrendo porque a primeira aplicação efetuou um post na tabela, mas não efetuou o commit para libera-la. Qdo o segundo aplicativo for atualizar esta tabela, esta estara bloqueada, aguardando o commit.
GOSTEI 0
Fernando Marroco
07/10/2003
Caro amigo estou testando em dois terminais o primeiro que entra, grava com o post e executa o commit logo em seguida veja a rotina....
with dmSenhas do begin
bd.StartTransaction;
try
with dmSenhas.qryControle_Geral do
begin
close;
if not prepared then prepare;
open;
edit;
qryControle_Geralentrada_ok = ´S´;
qryControle_Geralsaida_ok = ´N´;
post;
end;
bd.Commit;
except
on E:EDataBaseError do begin
bd.Rollback;
showError( E );
abort;
end;
o segundo terminal entra faz a mesma rotina (logico ne´) e grava normal sai normal gravando da mesma forma a mesma rotina de saida.
with dmSenhas do begin
bd.StartTransaction;
try
with dmSenhas.qryControle_Geral do
begin
close;
if not prepared then prepare;
open;
edit;
qryControle_Geralentrada_ok = ´N´;
qryControle_Geralsaida_ok = ´S´;
post;
end;
bd.Commit;
except
on E:EDataBaseError do begin
bd.Rollback;
showError( E );
abort;
end;
Só que na hora da saída do primeiro terminal que entrou no sistema ele da a seguinte mensagem:
A DEADLOCK WAS DETECTED
DEADLOCK UPDATE CONFLICTS WITH CONCURRENT UPDATE
no primeiro terminal que entrou ??????? porque o que esta de errado?????
será que é algum problema de configuração do INTERBASE ou do BDE?????? será que tenho que acrescentar algum comando quando eu STARTO UMA TRANSAÇÃO.... ????? me ajude por favor tenho que entregar esse sistema meu emprego depende disso??????? estou desesperado!!!!!!
with dmSenhas do begin
bd.StartTransaction;
try
with dmSenhas.qryControle_Geral do
begin
close;
if not prepared then prepare;
open;
edit;
qryControle_Geralentrada_ok = ´S´;
qryControle_Geralsaida_ok = ´N´;
post;
end;
bd.Commit;
except
on E:EDataBaseError do begin
bd.Rollback;
showError( E );
abort;
end;
o segundo terminal entra faz a mesma rotina (logico ne´) e grava normal sai normal gravando da mesma forma a mesma rotina de saida.
with dmSenhas do begin
bd.StartTransaction;
try
with dmSenhas.qryControle_Geral do
begin
close;
if not prepared then prepare;
open;
edit;
qryControle_Geralentrada_ok = ´N´;
qryControle_Geralsaida_ok = ´S´;
post;
end;
bd.Commit;
except
on E:EDataBaseError do begin
bd.Rollback;
showError( E );
abort;
end;
Só que na hora da saída do primeiro terminal que entrou no sistema ele da a seguinte mensagem:
A DEADLOCK WAS DETECTED
DEADLOCK UPDATE CONFLICTS WITH CONCURRENT UPDATE
no primeiro terminal que entrou ??????? porque o que esta de errado?????
será que é algum problema de configuração do INTERBASE ou do BDE?????? será que tenho que acrescentar algum comando quando eu STARTO UMA TRANSAÇÃO.... ????? me ajude por favor tenho que entregar esse sistema meu emprego depende disso??????? estou desesperado!!!!!!
GOSTEI 0
Adilsond
07/10/2003
Qual o TransIsolation que estas utilizando em seu TDatabase???
Outra coisa, experimente fechar sua query.
Outra coisa, experimente fechar sua query.
begin with dmSenhas do begin bd.StartTransaction; try with dmSenhas.qryControle_Geral do begin if Active then Close; if not Prepared then Prepare; Open; Edit; qryControle_Geralentrada_ok.Value := ´S´; qryControle_Geralsaida_ok.Value := ´N´; Post; bd.Commit; Close; end; except on E:EDataBaseError do begin bd.Rollback; ShowError(E); qryControle_Geral.Close; Abort; end; end; end; end;
GOSTEI 0
Fernando Marroco
07/10/2003
Caro amigo utilizo o READCOMMITTED.
GOSTEI 0