这些是我想到的选项:
点网戴夫:
UPDATE mytable set f1=newval where id=666 and f1 := f1ValueFromSelect
查理校验和:
UPDATE mytable set f1=newval where id=666 and md5(concat(id,f1)) := checksumFromSelect
蒂莫西时间戳:
UPDATE mytable set f1=newval where id=666 and mytimestampfield := timestampFromSelect
维罗妮卡版本:
UPDATE mytable set f1=newval, version=version+1 where id=666 and version=versionFromSelect
我喜欢 Dave,因为不需要更改架构。但是必须将所有记录的原始数据保留在客户端上。如何比较斑点?
查理擅长发送给客户的数据较少。不确定 blob/clob 的性能
Tim 和 Veronica 非常简单,但可能需要更改架构。时间戳看起来更加万无一失。它的跨平台性如何?
谢谢!
在某种程度上取决于您的 DBMS 平台。在基于 SQL Server 的开发中,我在侏罗纪晚期做过,我们使用时间戳,因为这些在写入记录时会自动更新。
您加载记录:
并保存
...或类似的东西,具体取决于处理并发的位置。
Oracle 没有这样的时间戳,所以我在同一时代所做的 Oracle 工作是通过增加版本计数器来实现的。
我对校验和和比较字段值的看法是它更复杂,因此更容易出错,因此最好仅在您无法选择在记录中使用时间戳或版本时才使用它。而且,是的,如果不对这个问题应用任何 google-fu,我也想不出一种方法来处理 BLOB。您也许可以通过以下方式单独进行比较:
因此,作为一种意见,如果可以的话,请使用时间戳或版本控制——这要简单得多。如果您没有更改数据库的选项,您可以进行字段比较或散列,但它更繁琐。