异步任务,一般使用于耗时的附加功能,如果在主方法的事务中向数据库插入数据,此时调用异步任务读取主事务插入的数据,可能会存在查询不到数据的问题。
发生场景:
上述场景中,主方法向用户表中插入数据,但是剩余的业务逻辑还未执行结束,此时开启一个异步线程,异步任务中的业务逻辑是读取主方法新增的user,并根据user的邮箱发送消息;此时如果主方法中的事务还未提交,那么异步任务中读取新增的user可能会出现读取不到的情况。
解决方式:
-
判断主方法中,业务执行结束并且事务提交过程需要多久,然后在异步方法中让线程休眠对应的时间;
-
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)注解,添加对事件的监听
//该注解作用是在主事务提交后,在执行次异步方法。
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void addWaiXiePayJzd(WaiXieJzdReq req){
System.out.println("异步任务执行====")
}