Concorrência de Dados. Como resolver isso?
Fala Pessoal
Estou com um problema na minha aplicação. Quando dois usuários estão alterando o mesmo registro quando o primeiro grava, no segundo quando for gravar da um erro:
´Record not found or changed by another user.´
Até aí tudo certo, afinal o usuário 1 realmente alterou o registro antes do usuário 2. Daí vem 2 problemas:
1) Se o usuário 1 faz uma pesquisa, e o usuário 2 tbém faz a pesquisa mas altera o regsitro 1 a grava, o mesmo registro no usuário 1 está desatualizado pois ele fez a pesquisa antes do usuário 2 alterar. Como eu faço para reconhecer que um registro está desatualizado e precisa ser reselecionado?
2) Para evitar o problema de concorrência, preciso de uma forma de travar o registro se um usuário já estiver com este registro em modo de alteração. Como eu sei que um determinado registro está sendo editado?
Agradeço toda a ajuda
Valew
Estou com um problema na minha aplicação. Quando dois usuários estão alterando o mesmo registro quando o primeiro grava, no segundo quando for gravar da um erro:
´Record not found or changed by another user.´
Até aí tudo certo, afinal o usuário 1 realmente alterou o registro antes do usuário 2. Daí vem 2 problemas:
1) Se o usuário 1 faz uma pesquisa, e o usuário 2 tbém faz a pesquisa mas altera o regsitro 1 a grava, o mesmo registro no usuário 1 está desatualizado pois ele fez a pesquisa antes do usuário 2 alterar. Como eu faço para reconhecer que um registro está desatualizado e precisa ser reselecionado?
2) Para evitar o problema de concorrência, preciso de uma forma de travar o registro se um usuário já estiver com este registro em modo de alteração. Como eu sei que um determinado registro está sendo editado?
Agradeço toda a ajuda
Valew
Seu_madruga
Curtidas 0
Respostas
Thomaz_prg
01/06/2006
Pelo jeito você está usando ADO... mas com qual Banco?
Esse bloqueio é feito no proprio banco de dados (chamado travamento pessimista), pois não teria como a aplicação saber o que está e o que não está em edição. Diga qual banco de dados tá usando (Access??), quais componentes de acesso e qual versão do Delphi para que alguém possa ajudá-lo um pouco mais.
No Firebird basta que se acrescente [b:80b49dfc72]WITH LOCK[/b:80b49dfc72] no final do select que todos os registros selecionados seriam bloqueados.
Esse bloqueio é feito no proprio banco de dados (chamado travamento pessimista), pois não teria como a aplicação saber o que está e o que não está em edição. Diga qual banco de dados tá usando (Access??), quais componentes de acesso e qual versão do Delphi para que alguém possa ajudá-lo um pouco mais.
No Firebird basta que se acrescente [b:80b49dfc72]WITH LOCK[/b:80b49dfc72] no final do select que todos os registros selecionados seriam bloqueados.
GOSTEI 0
Seu_madruga
01/06/2006
Estou usando Banco de Dados Firebird e DBExpress
SQLConnection <- SQLDataSet <- DataSetProvider <- ClientDataSet
SQLConnection <- SQLDataSet <- DataSetProvider <- ClientDataSet
GOSTEI 0
Rodolfo.pirolo
01/06/2006
Seu_Madruga,
Para este fim criei uma tabela para controlar as alterações efetuadas.
Antes de permitir a alteração verifico se este registro não esta na tabela de controle, se estiver não permito a edição do mesmo.
Funciona bem, mas dá um pouco de trabalho.
Espero ter ajudado.
Abraços
Rodolfo
Para este fim criei uma tabela para controlar as alterações efetuadas.
Antes de permitir a alteração verifico se este registro não esta na tabela de controle, se estiver não permito a edição do mesmo.
Funciona bem, mas dá um pouco de trabalho.
Espero ter ajudado.
Abraços
Rodolfo
GOSTEI 0