近期作收益項目,大規模使用spring的定時任務,然一些錯誤如Null Session,Not Proxy.代碼沒法應用.java
前段時間查了下,發現一些解決方案.主要是查詢以後session已經關閉,最佳方案是修改session的做用域,讓其做用在整個service方法上.有些文檔是要修改sessionFactory,須要編寫xml配置文件.spring
看了下,感受不符合springboot的風格.後來看了個方案,添加transcational註解.springboot
昨天和別人在羣裏討論了spring的事務,發現他們用的spring有自帶事務和回滾控制,而後討論得知他們是在xml文件裏進行配置的.springboot中的事務是如何配置的,我作了幾個小例子.session
編寫了個updateTest()方法,修改一條記錄並保存,其中有一段代碼爲 throw new NullPointerException("測試用");
然事務沒回滾. 接着又改方法名爲update(),仍是沒效果.app
加Transcational註解, 該註解是spring裏的註解,非javax裏的那個.spring-boot
如今測試,事務已回滾.測試
將該方法名修改成updateTest();在測試中,該事務回滾,這與spring的測試機制有關.url
在正常的執行中,updateTest()方法也進行回滾.code
將方法修改成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中使用.