como gravar dados de micros diferentes
Estou com um problema ao gravar dados do meu cliente no servidor.
Aparece esse erro:
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:
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.
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?
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
Curtidas 0
Respostas
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
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
29/08/2003
Você Tem a Opção Assinalada do IBTransaction
Read-Commited
Read-Commited
GOSTEI 0