Fórum como gravar dados de micros diferentes #38413
29/08/2003
0
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
Curtir tópico
+ 0
Responder
Posts
01/09/2003
Jrigo
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
Responder
Gostei + 0
29/10/2003
Maicon Loffi
Você Tem a Opção Assinalada do IBTransaction
Read-Commited
Read-Commited
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)