起因: 我司需要在已有逻辑上增加对数据的统计;
实现: 在单个流程执行完毕之后异步发起对数据的统计;
异常: 订单完成之后统计是发现订单非完成状态;
原因: 统计动作的发起位置放在了事务之中, 统计动作执行的时候, 事务还没有提交完毕, 导致读取不到事务提交之后的数据;
解决: 将异步任务提到service之外, 根据service的返回值, 判断是否执行统计任务;
引发的一系列思考:
特殊情况下甚至可能会出现异步执行完毕, 但是事务却回滚的状态.
所有无法被事务影响的操作都应该在事务之外; 例如对缓存, mq, 异步等.
但是这里是对返回值进行了判断才确定是否执行任务, 可以有不需要判断返回值直接执行的情况, 那就是对于拒绝执行的判断全都抛出异常, 只要全部成功之后才会执行异步任务.
(mq很多时候比异步更合适, mq可以实现跨系统通信, 可以从任何位置发起下一个任务的执行. 但是异步对于邮件发送, 短信提醒一类等小任务更方便).