Springboot中使用@Transactional注解7大失效场景及解决方案
在Spring Boot中使用@Transactional注解时,可能会遇到一些失效的场景。以下是七大失效场景以及相应的解决方案:
方法不是public的
解决方案:确保使用@Transactional注解的方法是public访问权限。
不是Spring管理的Bean中的方法
解决方案:将含有@Transactional方法的类用@Component或@Service等注解标注为Spring的Bean。
注解在非只读事务上
解决方案:确保@Transactional注解的propagation属性设置为Propagation.REQUIRED或Propagation.REQUIRES\_NEW。
异常类型不正确
解决方案:默认情况下,Spring只会回滚RuntimeException和Error。如果想要对CheckedException回滚,需要设置@Transactional注解的rollbackFor属性。
方法内部调用
解决方案:方法A标记了@Transactional,在方法A内部调用方法B,即使B方法加了@Transactional注解,也不会产生事务。解决方法是在A方法中通过AopContext获取代理对象,调用代理对象的B方法。
异步方法中使用
解决方案:在使用@Transactional注解的异步方法中,事务不会起作用。需要手动在异步任务内部开启事务。
事务方法嵌套调用
解决方案:嵌套调用的事务方法也不会生效。解决方法是将内部事务方法抽取为服务方法,并在需要的地方直接调用该服务方法。
注意:在使用@Transactional注解时,确保已经配置了正确的事务管理器,并且已经开启了基于注解的事务管理。
评论已关闭