背景:
批量记账时,会将每笔交易先累积起来,然后等到了批量出账日时才将累积记录拉出来进行账单计费。通常交易单会以用户id作为分库分表位,而累积记录汇总账单面向商户以商户id作为分库分表位。
问题原因:
单笔账单事件处理状态和累积记录录入需要在同一个事务中进行,但是由于分库分表位不同,产生了分布式事务问题。
原方案问题:
在缓存插入幂等记录
问题解决:
将账单事件状态推进和累积记录插入分割成两个事务,由幂等进行保障。
- 读取用户库账单事件
- 创建商户库幂等记录
- 商户库累积记录
- 修改用户库账单事件
2、3步在一个事务即可,即使步骤4失败,下次重试也会被幂等