生产上偶尔会出现这样的问题:
这个业务流程中最后时间执行的代码,而且明明日志打印执行成功了,但是为什么数据库值不对。(更新时间有时候因为各种原因,比如,客户端根据更新时间做了缓存,非关键字段信息更新不会更新更新时间、历史代码遗留很多地方更新个别底字段不做更新更新时间操作、其他原因等都没有更新更新时间,无法根据日志时间,更新时间判断问题)
经过查找:最后发现跑批中有批处理逻辑,一次获取List,然后单条数据调用接口进行处理,恰好非常巧合,List刚拿完一批数据,处理到一半,其他程序把它更新了,(很多编写代码时不会考虑到
过于严谨的逻辑,认为这个处理比较快,不会那么巧)等到遍历到该条数据时,又被更新成其他值,导致数据状态不对。类似的还有很多情况。
解决方法:
1.跑批配置尽量放在晚间三点钟左右,尽量排除这个时间点人员业务影响。
2.单次跑批数据size设置小点,能很快执行完,几乎不影响数据状态的正确性。
3.书写严谨逻辑,更新前去考虑它现在应该的值,可能覆盖的值(已被其他地方更新的值),排除这些值再去更新(有些业务情况下不好实现这个判断)
4.添加版本号字段控制,查list时查出当前数据version,遍历到该条数据时再去查当前数据version,对比两次version,一样则更新,否则根据情况判断是否更新(对历史版本,
更新地方较多的改造不友好,但是只在容易相互覆盖的地方更新时使用还是可以的)
还有其他好的方法吗?欢迎留言!