您的位置:首页 > 编程语言 > Java开发

关于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 事务