分析
当db server不在同一台机的情况下,就会出现分布式事务,官方有强一致解决方案JTA(java transactions API)(多个server通过一个事务管理器统一管理事务) ,不过在高并发场景下并不使用,太慢。
采用单机事务加消息队列,弱一致性解决性能问题。需要添加t表记录操作,例子:a 先 b转100 块
- 单机事务,a扣100,t表插入要先b转100记录,事务结束
- 定时任务拿t表记录写入MQ(t表标记已消费),定时任务MQ消费队列记录
疑点:mq写队列与修改t表记录可能不同步,导致写了mq,t表状态没有修改过来,重复写入mq
幂等性:对一个事物操作无数次,事务不受影响即是幂等,例如读操作,写操作非幂等,所以mq可以重复插入多条,只要保存t表执行状态(新表),便可以知道是否已经执行
解决方案:消费mq时查看消息执行状态,选择是否执行操作