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"); }