鍍金池/ 問答/Java/ spring如何解決多個事務方法放在一個事務方法并可以回滾

spring如何解決多個事務方法放在一個事務方法并可以回滾

@Transactional
test1(){

test2();//如果這個方法執(zhí)行成功,存儲數據到數據庫了


test3();//這個方法有問題,報空指針異常什么的,那么整個test1方法會回滾嗎,包括test2已經存到數據庫上的數據會回滾嗎
}

@Transactional
test2(){
    
}


@Transactional
test3(){
    
}


我測試了一下,這樣不可以回滾,我想問的是如何解決這種情況呢

回答
編輯回答
清夢

你應該用到spring的事務傳機制,也就是PROPAGATION_REQUIRED,
當然spring默認就是這個值,那可能出現的問題就是,拋出的異常是運行時異常,spring默認是不回滾運行時異常

2017年10月21日 11:27
編輯回答
九年囚

其實是可以回滾的,我這里的問題是只是配置了xml 版

<tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="delete*" propagation="REQUIRED" read-only="false" 
                       rollback-for="java.lang.Exception"/>
            <tx:method name="insert*" propagation="REQUIRED" read-only="false" 
                       rollback-for="java.lang.Exception" />
            <tx:method name="update*" propagation="REQUIRED" read-only="false" 
                       rollback-for="java.lang.Exception" />
            <tx:method name="edit*" propagation="REQUIRED" read-only="false"
                       rollback-for="java.lang.Exception" />
            <tx:method name="save*" propagation="REQUIRED" read-only="false"
                       rollback-for="java.lang.Exception" />
        </tx:attributes>
    </tx:advice>

如果還要使用注釋@Transcational 還需添加

 <tx:annotation-driven transaction-manager="txManager" />```
最后,最好不要xml版與注釋混用,雖然好像也可以,不過挺麻煩的。
2017年1月10日 15:22