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.

}