Gostaria de saber como o Infra faz a validação do objeto que será
persistido, ou seja um user_01 carregou um objeto TCliente.oid = 001 e
o user_02 carregou o mesmo TCliente.oid=001, e o user_02 faz uma
alteração numa propriedade do TCliente.DataNascimento ( o cara ficou
sabendo que nasceu noutro dia ....) e o user_02 salva o
TCliente.oid=001 e pronto.
Agora pergunto: Se o user_01 colocar o TCliente.oid=001 em edição
(lembre-se o objeto já havia sido recuperado do banco já faz tempo) ,
e alterar a propriedade TCliente.Nome por exemplo, quando ele for
salvar irá salvar com o valor da propriedade TCliente.DataNascimento
antigo (sem a alteração feita pelo user_02), criando uma
inconsistência nos dados do cadastro.
O Infra faz validação dos estados das propriedades quando vai salvar
um registro? (estilo ClientDataSet?)
O Infra faz lock do registro para que não tenha esse tipo de problema?
Ativo o lock e o registro nao pode ser alterado por nenhum outro
user .
Existe alguma outra maneira de se evitar esse tipo de ocorrência?
O método Press de fazer isto é colocar um campo updatecount em cada
tabela. A cada alteração esse update é atualizado para mais um, e a
cada update um 'and updatecount=n' é acrescentado a clausula where
para evitar alterar um objeto já alterado. De resto é conforme o
Marcos colocou na mensagem original.
Um plus para essa abordagem é: caso o updatecount seja diferente, lê
os campos alterados no BO e compara o seu 'old' com o que tem no
banco. Igual? Continua a gravação. Diferente? Ergue uma exceção.
> acho
> que para fazer lock pessimista vc tem de fazer a leitura usando um tipo de
> transação própria e então ninguem poderá pegar este registro para gravação,
> somente como leitura.
Lock pessimista? Foge disso exceto se você souber exatamente o que e
porque você está fazendo.
Joao Morais