场景:
事务A调用异步事务B:
事务A逻辑:接口接收参数后将库存变动明细保存到记录表,保存后调用异步方法B。
事务B逻辑:将库存变动明细记录表数据汇总到库存表。
问题:
如果事务A在事务提交之前已经调用事务B,且在异步调用事务B之后事务A出现异常,导致事务A回滚,那么事务B在执行时拿到的数据就是错误的,导致汇总数据时有可能出现错误,导致库存不准确。
解决方案:
在事务A提交事务之后再调用异步事务B。
@Transactional
public void save(){
saveStockDetail();//保存库存变动明细
saveStock();//事务提交后执行汇总库存方法
}
/**
事务提交之后执行
*/
private void saveStock(){
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
//异步更新库存
updStock();
}
});
}