添加@Transactional ------spring boot中session中斷的問題及其解決

近期作收益項目,大規模使用spring的定時任務,然一些錯誤如Null Session,Not Proxy.代碼沒法應用.java

前段時間查了下,發現一些解決方案.主要是查詢以後session已經關閉,最佳方案是修改session的做用域,讓其做用在整個service方法上.有些文檔是要修改sessionFactory,須要編寫xml配置文件.spring

看了下,感受不符合springboot的風格.後來看了個方案,添加transcational註解.springboot

@Transcational

昨天和別人在羣裏討論了spring的事務,發現他們用的spring有自帶事務和回滾控制,而後討論得知他們是在xml文件裏進行配置的.springboot中的事務是如何配置的,我作了幾個小例子.session

階段1

編寫了個updateTest()方法,修改一條記錄並保存,其中有一段代碼爲 throw new NullPointerException("測試用"); 然事務沒回滾. 接着又改方法名爲update(),仍是沒效果.app

階段2

加Transcational註解, 該註解是spring裏的註解,非javax裏的那個.spring-boot

如今測試,事務已回滾.測試

階段3

將該方法名修改成updateTest();在測試中,該事務回滾,這與spring的測試機制有關.url

在正常的執行中,updateTest()方法也進行回滾.code

階段4

將方法修改成testCal();在spring的測試中回滾了.可能與spring的測試機制有關,只要在測試中加了@Transactional註解,出現異常就會回滾.xml

用url請求,仍出現異常回滾.

p>By default checked exceptions do not result in the transactional interceptor marking the
 * transaction for rollback and instances of RuntimeException and its  subclasses do. This default
 * behavior can be modified by specifying exceptions that result in the interceptor marking the
 * transaction for rollback and/or exceptions that do not result in rollback.</p>
 * <p>The rollbackOn element can be set to indicate exceptions that must cause the interceptor to mark
 * the transaction for rollback.</p>
 * <p>Conversely, the dontRollbackOn element can be set to indicate
 * exceptions that must not cause the interceptor to mark the transaction for rollback.</p>
 * <p>When a class is specified for either of these elements, the designated behavior applies to subclasses
 * of that class as well. If both elements are specified, dontRollbackOn takes precedence.</p>

默認,transcational不會對RuntimeException及其子類進行回滾. 可是若是回滾了,就用dontRollbackOn 屬性指定RuntimeException不會滾,這樣它自己和它的異常都不會使事務回滾.dontRollbackOn的優先級更高.

總結

spring-data-jpa的service層中的方法若是不加事務註解是不會回滾的,該註解能夠加在類和方法上.如今的版本加上以後就會回滾,讀者使用時可自行測試.rollBackOn屬性指定回滾的異常類,dontRollBackOn屬性,指定不回滾的異常類.

僅限於spring-boot中使用.

相關文章
相關標籤/搜索