案例描述
部分对账文件的明细汇总金额比实际要少。
原因分析
在明细汇总和更新汇总状态为“已处理”之间存在几毫秒的时间差。
在时间差内又入库了多条明细,并且状态由“待处理”更新为“已处理”,但是这部分明细并没有参与明细汇总,因此被遗漏了。
汇总处理sql简略如下:
<!--00是待处理,01是已处理-->
SELECT SUM(amount) from fs_detail where status = '00';
更新状态sql简略如下:
update fs_detail set status = '01' where status = '00';
解决方案
新增明细状态“处理中”,在明细汇总之前,锁定符合汇总条件的明细为“处理中”,只汇总“处理中”状态的明细,汇总完成后将“处理中”的明细状态更新为“已处理”。
如果在这时间差内有明细入库,由于它们的状态是“待处理”,所以既不会参与汇总,也不会被更新状态,将会参与下一轮汇总。
如果汇总过程中出现异常,则回滚这次锁定的明细状态,由“处理中”回滚为“未处理”。