Java @Transactional指定回滚条件

 更新时间:2022年08月09日 11:39:06   作者:梁云亮​​​​​​​  
这篇文章主要介绍了Java @Transactional指定回滚条件,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下

异常分类

  • 可查的异常(checked exceptions):Exception下除了RuntimeException外的异常
  • 不可查的异常(unchecked exceptions):RuntimeException及其子类和错误(Error)

@Transactional注解属性详解

属性类型描述
valueString可选的限定描述符,指定使用的事务管理器
propagationenum: Propagation可选的事务传播行为设置
isolationenum: Isolation可选的事务隔离级别设置
readOnlyboolean读写或只读事务,默认读写
timeoutint (in seconds granularity)事务超时时间设置
rollbackForClass对象数组,必须继承自Throwable导致事务回滚的异常类数组
rollbackForClassName类名数组,必须继承自Throwable导致事务回滚的异常类名字数组
noRollbackForClass对象数组,必须继承自Throwable不会导致事务回滚的异常类数组
noRollbackForClassName类名数组,必须继承自Throwable不会导致事务回滚的异常类名字数

@Transactional

使用@Transaction注解时,阿里巴巴代码规范插件会提醒需要指定rollbackFor以显示的rollback

默认情况下,Spring框架在使用@Transaction处理事务时默认只在抛出运行时异常unchecked exceptions时才会事务回滚。也就是说,当抛出个RuntimeException 或其子类例的实例时,从事务方法中抛出的Checked exceptions将不被标识进行事务回滚。

  • 让checked异常回滚:在整个方法前加上 @Transactional(rollbackOn=Exception.class)
  • 让unchecked异常不回滚: @Transactional(dontRollbackOn=RunTimeException.class)
  • 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)

注意

  • 如果异常被try-catch了,事务就不会回滚,如果想让事务回滚必须再往外抛try{}catch{throw Exception}
  • Spring团队的建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。也可以在接口上使用 @Transactional 注解,但是这种情况需要设置基于接口的代理时才生效
  • @Transactional 注解标识的方法,建议处理过程尽量的简单。尤其是带锁的事务方法,能不放在事务里面的最好不要放在事务里面。可以将常规的数据库查询操作放在事务前面进行,而将增、删、改等操作放在事务中

代码

@Slf4j
@Service
public class MemberService {

    @Autowired
    private MemberMapper memberMapper;

    @Transactional
    public Integer insert(MemberEntity memberEntity) {
        Integer insertResult = 0;
        try {
            insertResult = memberMapper.save(memberEntity);
            log.info("insertResult:{}", insertResult);
            int result = 1 / memberEntity.getAge();
        } catch (Exception e) {
            log.error("errorMsg:{}", e.getMessage());
            //回滚
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        return insertResult;
    }
}

如上标红代码,如果不写的话,事务是不会回滚的。因为事务被 catch 捕获到了,所以只能手动的进行事务回滚。

到此这篇关于Java @Transactional指定回滚条件的文章就介绍到这了,更多相关Java @Transactional内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决CollectionUtils.isNotEmpty()不存在的问题

    解决CollectionUtils.isNotEmpty()不存在的问题

    这篇文章主要介绍了解决CollectionUtils.isNotEmpty()不存在的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • SpringCloud集成Nacos的使用小结

    SpringCloud集成Nacos的使用小结

    这篇文章主要介绍了SpringCloud集成Nacos的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 学会在Java中使用Optional功能

    学会在Java中使用Optional功能

    这篇文章主要介绍了学会在Java中使用Optional功能,在本文中,我们将了解如何、何时以及在哪里最好地应用Optional,具体相关内容需要的朋友可以参考下面文章内容
    2022-09-09
  • SpringBoot策略模式的实践使用

    SpringBoot策略模式的实践使用

    这篇文章主要介绍了SpringBoot 策略模式的实践使用,帮助大家更好的理解和学习使用SpringBoot,感兴趣的朋友可以了解下
    2021-04-04
  • Java使用贪心算法解决电台覆盖问题(示例详解)

    Java使用贪心算法解决电台覆盖问题(示例详解)

    贪心算法是指在对问题进行求解时,在每一步选择中都采取最好或最优的选择,从而导致结果理想化,下面通过本文介绍下Java使用贪心算法解决电台覆盖问题,需要的朋友可以参考下
    2022-04-04
  • 解决SpringBoot跨域的三种方式

    解决SpringBoot跨域的三种方式

    前后端分离是目前的趋势,解决跨域问题也是老生常谈的话题了,我们了解一下什么是域和跨域。域:协议 + 域名 + 端口;三者完全相同则为同域,反之有其一不同均为不同域。跨域请求:当前【发起请求】的域和【请求指向】的域属于不同域时,该次请求称之为跨域请求
    2021-06-06
  • 教你安装eclipse2021并配置内网maven中心仓库的图文详解

    教你安装eclipse2021并配置内网maven中心仓库的图文详解

    本文能通过图文并茂的形式给大家介绍安装eclipse2021并配置内网maven中心仓库的相关知识,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-09-09
  • Java动态代理Proxy应用和底层源码详细分析

    Java动态代理Proxy应用和底层源码详细分析

    Java动态代理是一种在运行时生成代理类的机制,用于代替手动编写代理类的过程,这篇文章主要给大家介绍了关于Java动态代理Proxy应用和底层源码详细分析的相关资料,需要的朋友可以参考下
    2024-03-03
  • java8新特性-Stream入门学习心得

    java8新特性-Stream入门学习心得

    这篇文章主要介绍了java8新特性-Stream入门学习心得,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 基于Java创建XML(无中文乱码)过程解析

    基于Java创建XML(无中文乱码)过程解析

    这篇文章主要介绍了基于Java创建XML(无中文乱码)过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10

最新评论