spring如何解决多个事务方法放在一个事务方法并可以回滚

@Transactional
test1(){

test2();//如果这个方法执行成功,存储数据到数据库了


test3();//这个方法有问题,报空指针异常什么的,那么整个test1方法会回滚吗,包括test2已经存到数据库上的数据会回滚吗
}

@Transactional
test2(){
    
}


@Transactional
test3(){
    
}


我测试了一下,这样不可以回滚,我想问的是如何解决这种情况呢

阅读 12.3k
2 个回答

其实是可以回滚的,我这里的问题是只是配置了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版与注释混用,虽然好像也可以,不过挺麻烦的。

你应该用到spring的事务传机制,也就是PROPAGATION_REQUIRED,
当然spring默认就是这个值,那可能出现的问题就是,抛出的异常是运行时异常,spring默认是不回滚运行时异常

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题