写事务时报了这样一个错org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope
此错在没有Transaction无法回滚事务。自调用导致@Transactional 失效。
spring里事务是用注解配置的,当一个方法没有接口,单单只是一个方法不是服务时,事务的注解是不起作用的,需要回滚时就会报错。
出现这个问题的根本原因在于AOP的实现原理。由于@Transactional 的实现原理是AOP,AOP的实现原理是动态代理,换句话说,自调用时不存在代理对象的调用,这时不会产生我们注解@Transactional 配置的参数,自然无效了。
虽然可以直接从容器中获取代理对象,但这样有侵入之嫌,不推荐。
也是在此记录一笔:
事务必须用在服务上,且一个服务一个事务,不得嵌套。