Spring @Transactional annotation 不回滾

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");
    }
相關文章
相關標籤/搜索