夜间批处理,如生成会计流水文件、总分对账文件、日终充值文件等,按账户当日日终余额或当日交易流水进行统计汇总,需要保持数据的一定静止,而夜间联机交易会更新账户余额,账户余额为动态。一般批量处理与联机处理的冲突区主要在账户余额,解决批量用账户日终余额与联机用账户实时余额的存储与使用问题,可很大程度实现7×24业务服务。也即解决总分账、会计账一致问题。
实现7x24服务,最关键的要点在于保证两份数据的准确并存:
- 动态实时数据(实时余额):主要是动账及日间查询交易使用
- 日切点的静态数据(上日余额):主要用于批处理:比如总分核对、财务供数等
目前各厂商主要使用的方案有以下几种:
- 单表双余额
- 双表(双表又分两种:临时表为分户临时表或是流水临时表)
工商银行模式双主档、单余额、双流水, 中国银行模式双主档、单余额、单流水, 建设银行模式单主档、双余额、双流水, 民生银行模式单主档、单余额、双流水
参考建行方案,结合双日期、双余额的分户帐设计,制定如下方案:
双余额每日更新方案
分户账上设置当前余额、上日余额、最后交易日期。根据以上字段来实现当前余额、上日余额的读取和更新,系统每天将当前余额更新到上日余额,当前交易日期更新到最后交易日期。 其中当前交易日期也称会计日,存放在银行日期表
1. 日终批量刷新上日余额
日终切日后一开始直接批量刷新上日余额,便于后续读取及供数。为避免长时间锁表,该批量任务逐笔处理。
- 对于一笔分户账,
- IF 最后交易日期 < 当前交易日期
- UPDATE 分户账 SET 上日余额=当前余额,最后交易日期=当前交易日期
2. 动账处理
切日后,日终批量刷新需要一段时间,为确保在此期间的联机交易正常对外服务,动账时当日第一笔交易更新上日余额、最后交易日期。
首先检查帐户的‘最后交易日期’与‘当前交易日期’是否相同,如果不同,说明该帐户第一次更变余额,此时要将‘当前余额’放入‘上日余额’,‘最后交易日期’更改为此‘当前交易日期’,并记录交易流水,该交易流水的日期为日切后当前交易日期。 换日后的第二笔及更多交易,只更新当前余额,并记录交易流水。
联机交易与日终批量更新上日余额有极小的可能会出现冲突(同时更新同一账户)。如果发生,解决如下:(1) 如果批量锁表,联机失败,交易重做将成功。 (2)如果联机锁表,批量失败,批量重新从断点重跑。
3. 获取上日余额处理
取上日余额的情景均在日终刷新上日余额之后,直接取分户账中的上日余额即可。
参考链接
https://www.jianshu.com/p/c0c20144027b
https://zhuanlan.zhihu.com/p/20894306
上述两个链接的方案合并阅读,可得方案。