Banco de dados em Rede - evitar 2 usuarios perder dados em update |
Top Previous Next |
|
{ Sindrome da Atualizacao Perdida ===============================
Se voce usa SQL para seus cadastros e não trabalha com as tabelas abertas (usa TEdits):
Imagine esta tabela CLIENTES.DBF (ou num MSSQL server)
Codigo Nome Limite ------ ---------------------- ------ 1 Junior 10,00 2 Antonio 1,99
2 usuários entram em rede ao mesmo tempo na edição do cliente de código 1.
Um deles muda o limite para 20,00 e outro para 5,00 Ao pressionar o botão GRAVAR sempre o que alterou por ultimo tem a preferencia. (ou seja, o 1. usuário pensa que o limite ficou em 20,00 quando na verdade está em 5,00).
Como resolver este problema?
* Crie um campo que conterá a data e hora da ultima atualizacao: (para tabelas que aceitam tipo DATATIME crie um campo só.)
Codigo Nome Limite Dt_Atu Hr_Atu ------ ---------------------- ------ ---------- -------- 1 Junior 10,00 09/01/2001 11:04:05 2 Antonio 1,99 09/01/2001 11:04:05
* Sempre que for atualizar um registro, voce deverá fazer com que no Where alem do código inclua tambem os campos data e hora, por exemplo:
update clientes set nome = "novo valor", limite = "novo valor", dt_atu = "hoje", hr_atu = "hora de agora" where codigo = "codigo" and dt_atu = "old_dt_atu" and hr_atu = "old_hr_atu"
* Os campos old_dt_atu e old_hr_atu são os mesmos conteudo dos campos dt_atu e hr_atu ASSIM QUE ENTROU NA EDICAO. ou seja ele só irá processar o UPDATE caso ninguem neste meio tempo já tenha alterado, pois a data e hora de atualizacao impedem de o ultimo usuario altere só conseguira caso a data e hora nao foram atualizados por outro usuario. O where impede isso.
* Resumindo: no exemplo acima o 1. usuario ira conseguir atualizar, mas o 2. usuario receberá uma mensagem do tipo "Este registro foi atualiza por outro usuario"
* Segundo o livro Delphi 5 - Tópicos avançados esta é a melhor tecnica para perder atualizacoes em rede quando não se usa Table. }
|