1【问题重现】 java
基于annotation配置,使用 web
org.springframework.web.WebApplicationInitializer
启动的web app, IoC容器继承自 spring
org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
而不使用传统的在web.xml 配置方式。 app
加上一下注解: spa
@Configuration @EnableWebMvc @ComponentScan(basePackages = "org.richard.wu") @PropertySource("classpath:jdbc.properties") @EnableTransactionManagement //事物注解 public class AppConfig extends WebMvcConfigurerAdapter { }
在service类加上@Transactional后故意在2 update操做之间抛出一个 code
java.lang.ArithmeticException
那么问题来了,检验发现第一个update 操做竟然没有被回滚!!! xml
【解决】 继承
仔细看了文档发现spring 的@Transactionl 仅仅在 文档
RunTimeException
才回滚,因此为了让他对全部Exception回滚,必须这样写: servlet
@Transactional(propagation= Propagation.REQUIRED, rollbackFor=Exception.class, readOnly=false)
关键是rollbackFor这个参数。可是改了以后发现仍是不能如期回滚,百思不得姐,后来忽然想到既然@Transactionl是经过异常类型来触发回滚的,然么关键就是要有异常从方法里面传递出来,再看看代码里面已经把异常部分用try catch住了,恍然大悟,赶忙解除try catch块,果真就ok了。又或者在catch到Exception后再次抛出也是能够的:
try { //update 1 //exception occur here //update 2 }catch (SQLException e){ throw new SQLException( "出现SQL异常,回滚操做1"); }