spring 事務無效解決方法


(原)

spring 事務目前有二種,聲明式(declarative transaction)和編程式(programming transaction),以前都是以公司里的框架寫好的,沒有學習的機會,今天抽空好好試了下,結果遇到好多問題。

1、注解的方式

最開始是這么玩的,發現數據進數據庫了,沒有起作用,然后各種搜索,終於找到問題了,在@Transactional中,默認只有拋出運行時異常才會回滾,也就是說throw new RuntimeException();而我這里是Exception。

在spring的文檔中說道,spring聲明式事務管理默認對非檢查型異常和運行時異常進行事務回滾,而對檢查型異常則不進行回滾操作。

在這里,RuntimeException是非檢查型異常,Exception是檢查型異常

這里有二種解決辦法,1、將Exception類改為RuntimeException類拋出,2、將@Transactional注解改為@Transactional(rollbackFor = Exception.class),也就是說檢查型異常一樣回滾。二種改法結果測試都通過。

2、配置XML(需要aspectj的支持)

由於是在網上找的例子建的ssm框架,例子中並沒有事務,所以才需要添加,注解的方式成功后,下面來試試聲明式的,結果一上來就發現報錯

 

 

網上搜了一下,發現是少jar包引起的

ava.lang.NoClassDefFoundError:org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException

缺少的兩個jar包:aspectjrt.jar;aspectjweaver.jar ,這是springAOP所依賴的包

加進這二個JAR包以后,啟動成功。

跟注解式的一樣,拋出Exception異常數據一樣進數據庫,而拋出RuntimeException異常成功回滾,然后在tx:method中一樣找到了rollback-for的屬性,加上去后,Exception異常也能成功回滾了

 3、 Spring的AOP中,XML注入TransactionProxyFactoryBean這個類

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM