Spring事务回滚条件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011861874/article/details/81542767

       在spring项目中,很多时候事务出现了异常,但是却没有回滚,导致数据库中产生脏数据。那位为什么明明出现了异常,事务却没有回滚呢,下面分析一下spring事务回滚的条件。

       Spring事务回滚机制是这样的:当所拦截的方法有指定异常抛出,事务才会自动进行回滚!

       1、拦截的方法:

            事务的控制方式有三种:

            ①声明式:使用SpringAop配置事务,这种方式大大的简化了编码。需要注意的是切入点表达式一定要写正确,切入点错误,无法准确拦截方法,会导致事务无法回滚。

            ②注解式:在方法或类上直接使用@Transactional注解,非常简洁方便。

            ③编程式:在代码中手工开启事务,手工提交,出现异常,手工回滚。优点是异常都会回滚捕获,不会出现无法回滚的情况,缺点是太麻烦。

            事务不回滚的都是采用的声明式事务或者是注解事务;编程式事务都是自己写代码手动回滚的,因此是不会出现不回滚的现象。

       2、指定异常:

             默认情况下,事务只会回滚Error错误和RuntimeException运行期异常以及其子类等非受检异常。其他不属于运行其异常,一般不会回滚。但是费云清其异常不是不能回滚,如果想回滚,修改相关配置即可。

              声明式配置如下:

<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> 

              注解式配置如下:

@Transactional@ (rollbackFor=Exception.class)

       3、异常:

             事务要有异常,才会回滚,如果运行期异常被try catch了,但是异常捕获后没有继续抛出RuntimeException运行期异常,事务无法获取异常信息,也不会回滚。

展开阅读全文

没有更多推荐了,返回首页