como gravar dados de micros diferentes

Firebird

29/08/2003

Estou com um problema ao gravar dados do meu cliente no servidor.

Aparece esse erro:

Deadlock Update conflicts with concurrent update


Meu sistema está funcionando assim:

Estou usando Interbase como gerenciador de dados.

O Programa server está aberto e conectado ao banco de dados por:
Ibdatabase-Ibtransaction-Ibdataset (tudo ativado)
Tem um dbgrid mostrando os dados da tabela CONECTADOS.

O Programa client acessa o banco de dados no servidor por:
Ibdatabase-Ibtransaction-Ibdataset e o código que estou usando para gravar o registro é o seguinte:
 
with frmdmib do
   begin
            ibdataset2.close;
            ibdataset2.parambyname(´nome´).asstring:=´Micro02.mshome.net´;
            ibdataset2.open;
            ibdataset2.Edit;
            ibdataset2.FieldByName(´usuario´).AsString := edit1.Text;
            ibdataset2.Post;
            ibdataset2.Transaction.CommitRetaining;
     end;


Os dados são gravados normalmente.
Mas logo em seguida preciso gravar uma informação em determinado campo na mesma tabela, só que agora a informação deve ser gravado pelo server, quando o server tenta gravar da esse erro.

Deadlock Update conflicts with concurrent update


Por que ocorre esse conflito?
Já que as informações não estão sendo gravadas ao mesmo tempo.
Não consigo gravar informações no mesmo banco de micros diferentes?


Latrodectrus

Latrodectrus

Curtidas 0

Respostas

Jrigo

Jrigo

29/08/2003

Não use CommitRetaining, use somente Commit.

E também dependendo do nivel de isolamento que você esta usando associado a forma de bloqueio realizada você deve reler os dados do banco de dados. Este me parece é o seu caso. Você vai ter que tratar esta exceção e ler novamente os dados apos o deadlock.

Uma forma de evitar isso é se fazer um bloqueio pessimista, ou seja, usar o isolamento Read Commited e na transação usar wait.
E no select do registro usar:

select campo from tabela for update with lock;

com isso o bloqueio se da no select. Assim voce faz o seu update e da um commit... Enquanto isso se alguém tentar acessar os dados vai esperar no select for update with lock também. Assim que o primeiro liberar o seguinte vai ler os dados já atualizados e seguira normalmente mantendo a consistencia nos dados (o que me parece o mais importante). Bem existem muitos pontos negativos neste uso de bloqueios, mas se você implementar de forma adequado pode ser muito util em algumas situações...

Espero ter ajudado...

Ps..: Tome cuidado com isto, Ja até fui criticado por alguns dos desenvolvedores do Firebird por usar este tipo de bloqueio. Mas é aquela história, nem Jesus Cristo agradou a todos...

Saudações,
Jean Derrie Rigo
rigo@floripa.com.br


GOSTEI 0
Maicon Loffi

Maicon Loffi

29/08/2003

Você Tem a Opção Assinalada do IBTransaction
Read-Commited


GOSTEI 0
POSTAR