@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不可使用在同一个方法上