关于Spring的@Transactional注解失效以及事务无法回滚问题
2017-05-12 15:08
846 查看
@Transactional失效问题
最近写的项目中需要一个service中的部分事务执行完就被commit,但是部分service需要失败回滚。因此写在一个大的service中并且加上@Transactional显然是无法满足需求的。 因此这是需要把原先的一个service服务拆分,如原先的serviceA被拆分成serviceA和ServiceB,并且在ServiceB上打@Transactional注解,而serviceA未打注解。 整体执行流程是由controller调用serviceA,再经serviceA调用serviceB。但是在执行过程发现serviceB中的事务语句在执行后就会被立马提交,事务控制未生效。 翻阅资料有的说因为context:component-scan重复加载导致失效,但是sprintg配置中扫描service的包无重复。于是抱着试试的心态在serviceA上继续添加@Transactional注解,返现这是serviceB的事务生效。 也就是说带事务注解的serviceA被其他service调用时,如果想要生效,最外层的也得加上@Transactional注解。
@Transactional,失败无法回滚
紧接着上个问题说,serviceB中的事务生效后,在执行遇到异常时,捕获并且抛出自定的异常InvalidException extends Exception。发现执行的sql事务无法回滚。无奈只能在注解上加上rollbackFor = InvalidException.class。但是为了弄明白原因,断点调试到spring底层代码,发现这么一句代码 return (ex instanceof RuntimeException || ex instanceof Error); 就是说要想事务回滚你的异常要么派生自RuntimeException或者Error,于是把InvalidException改成集成RuntimeExcepiton,并且把注解中的rollbackFor去除,发现也是可以正常回滚。
相关文章推荐
- Spring中声明式事务的注解@Transactional的参数的总结(REQUIRED和REQUIRES_NEW的与主方法的回滚问题)
- 关于Spring事务管理无法回滚的问题
- spring@Transactional注解事务不回滚不起作用无效的问题处理
- Spring MVC @Transactional注解方式事务无法回滚的解决办法
- 关于spring在service层catch异常而出现无法回滚的问题的解决
- Spring MVC @Transactional注解方式事务失效的解决办法
- 关于spring 的@cacheable 注解 无法生效的问题
- Spring MVC @Transactional注解方式事务失效的解决办法
- [spring,mysql] spring使用注解式事务声明(@Transactional)无法回滚 .
- spring@Transactional注解解决事务处理问题
- spring@Transactional注解解决事务处理问题
- Spring MVC @Transactional注解方式事务失效的解决办法
- Spring事务注解@Transactional回滚问题
- 关于Spring事务回滚的问题
- 关于Spring事务回滚的问题
- spring注解实现业务层事务管理,当业务层自调用时,事务失效问题解决
- Spring MVC @Transactional注解方式事务失效的解决办法
- spring3MVC 事务无法回滚问题
- Spring MVC @Transactional注解方式事务失效的解决办法