Estas são as opções que pensei:
DotNet Dave:
UPDATE mytable set f1=newval where id=666 and f1 := f1ValueFromSelect
Charlie Checksum:
UPDATE mytable set f1=newval where id=666 and md5(concat(id,f1)) := checksumFromSelect
Carimbo do tempo de Timóteo:
UPDATE mytable set f1=newval where id=666 and mytimestampfield := timestampFromSelect
Verônica Versão:
UPDATE mytable set f1=newval, version=version+1 where id=666 and version=versionFromSelect
Eu gosto de Dave, pois nenhuma alteração de esquema é necessária. No entanto, é necessário manter todos os dados originais do registro no cliente. Como comparar bolhas?
Charlie é bom em menos dados para enviar ao cliente. Não tenho certeza sobre o desempenho com blobs/clobs
Tim e Veronica são bons e bastante simples, embora possam exigir alteração de esquema. Timestamp parece um pouco mais infalível. Quão multiplataforma é?
Obrigado!
Depende da sua plataforma DBMS até certo ponto. No desenvolvimento baseado em SQL Server que fiz no final do período Jurássico, usamos registros de data e hora, pois eles são atualizados automaticamente quando o registro é gravado.
Você carrega um registro com:
E economize com
... ou algo assim, dependendo de onde a simultaneidade estava sendo tratada.
A Oracle não tem esse carimbo de data/hora, então as coisas da Oracle que fiz na mesma época funcionavam incrementando um contador de versão.
Minha opinião sobre soma de verificação e comparação de valores de campo é mais complicada e, portanto, mais fácil de cometer erros, portanto, é melhor usá-la apenas quando você não tem a opção de usar um carimbo de data/hora ou versão no registro. E, sim, sem aplicar nenhum google-fu à pergunta, também não consigo pensar em uma maneira de fazer isso com BLOBs de cabeça. Você pode fazer a comparação separadamente com algo como:
Então, como opinião, use carimbo de data/hora ou controle de versão se tiver a opção - é muito mais simples. Você pode fazer comparações de campo ou hash se não tiver a opção de alterar o banco de dados, mas é mais complicado.