@Transactional 和 @Async 同时使用时,事务失效了,请问是为什么?

@Transactional @Async 同时使用时,事务失效了,请问是为什么?代码如下:

 

@Service
public class AopProxyOrderServiceImpl implements AopProxyOrderService {

    @Autowired
    private AopProxyOrderService aopProxyOrderService;

    @Transactional
    @Override
    @Async
    public void crateOrder(String name) {
        AopProxyOrderService proxyOrderService = (AopProxyOrderService)AopContext.currentProxy();
        System.out.println("获取代理对象 proxyOrderService ="+proxyOrderService);

        System.out.println("我是目标方法 crateOrder,我被调用了...");
    }
}

可以看看 @Transactional @Async 生成代理的方式不一样,@Transactional 是使用 Spring AOP 中的 AbstractAutoProxyCreator 类去生成代理,此时这里已经产生了一个代理对象,而 @Async 其实不然,他是自己偷偷的实现了一套生成代理的方式,从而这里有出现了一个代理对象,两个代理对象完全不同,所以 @Async、或者是你自定义注解时一定要小心这个坑!

在多线程中spring的事务管理器注解@Transactional会失效,因此@Async与@Transactional不可使用在同一个方法上

参考 多线程下 @Async 注解导致 Spring 中的事务失效,该怎么办???_Java笔记虾的博客-CSDN博客