问题描述:
在项目里使用了线程池运行同一个类的实例方法,代码大致如下,运行时发现job方法的事务不生效
@Transactional public void doJob() { EXECOTOR.execute(() ->job()); } @Transactional public void job(){ //db operation }
原因分析:
debug进入job方法时,发现运行job方法的实例是个普通实例而不是个代理对象,因此无法实现aop增强
解决办法:
在doJob中调用AopContext.currentProxy()获取当前的代理对象,在代理对象上调用job方法
@Transactional public void doJob() { AAAService proxy = (AAAService) AopContext.currentProxy(); EXECOTOR.execute(() ->proxy.job()); } @Transactional public void job(){ //db operation }