SpringBoot声明式事务的简单运用说明

 更新时间:2020年09月18日 09:25:11   作者:justry_deng  
这篇文章主要介绍了SpringBoot声明式事务的简单运用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

关于事物的基本概念等这里就不介绍了。

Spring声明式事物的实现,有两种方式;第一种是配置xml,第二种是使用相关注解(这两种方式可详见《程序员成长笔记(一)》的相关章节)。SpringBoot中默认配置了第二种方式,所以,SpringBoot直接使用注解即可。下面介绍SpringBoot通过注解开启事物的使用。

SpringBoot使用事物的步骤:

第一步:在启动类上开启事物支持

提示:

@EnableTransactionManagement注解其实在大多数情况下,不是必须的,因为SpringBoot在

TransactionAutoConfiguration类里为我们自动配置启用了@EnableTransactionManagement注解。

不过自动启用该注解有两个前提条件,分别是:@ConditionalOnBean(PlatformTransactionManager.class)和@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class),而一般情况下,这两个条件都是满足的,所以一般的,我们在启动类上写不写@EnableTransactionManagement都行。本人这里还是建议写出来。

第二步:在业务逻辑层接口的实现类中的相关方法上声明事物

给出Transactional 注解的常用属性表:

属性

说明

propagation

事务的传播行为,默认值为 REQUIRED。

isolation

事务的隔离度,默认值采用 DEFAULT

timeout

事务的超时时间,默认值为-1,不超时。

如果设置了超时时间(单位秒),那么如果超过该时间限制了但事务还没有完成,则自动回滚事务。

read-only

指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。

rollbackFor

用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。{xxx1.class, xxx2.class,……}

noRollbackFor

抛出 no-rollback-for 指定的异常类型,不回滚事务。{xxx1.class, xxx2.class,……}

……

注意事项:

service实现类(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务管理,在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方式。

Transactional 注解只能应用到 public 可见度的方法上。 如果应用在protected、private或者 package可见度的方法上,也不会报错,不过事务设置不会起作用。

默认情况下,Transactional 注解的事物所管理的方法中,如果方法抛出运行时异常或error,那么会进行事务回滚;如果方法抛出的是非运行时异常,那么不会回滚。

注:SQL异常属于检查异常(有的框架将SQL异常重写为了运行时异常),但是有时我们写SQL时,检查异常并不会提示;而默认情况下,事物对检查异常不会作出回滚处理。

注:在很多时候,我们除了catch一般的异常或自定义异常外,我们还习惯于catch住Exception异常;然后再抛出Exception异常。但是Exception异常属于非运行时异常(即:检查异常),因为默认是运行时异常时事物才进行回滚,那么这种情况下,是不会回滚的。我们可以在@Transacional注解中,通过rollbackFor = {Exception.class} 来解决这个问题。即:设置当Exception异常或Exception的所有任意子类异常时事物会进行回滚。

注:被catch处理了的异常,不会被事物作为判断依据;如果异常被catch 了,但是又在catch中抛出了新的异常,那么事物会以这个新的异常作 为是否进行回滚的判断依据。

事务的传播机制(行为):

事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。

即:在执行一个@Transactinal注解标注的方法时,开启了事务;当该方法还在执行中时,另一个人也触发了该方法;那么此时怎么算事务呢,这时就可以通过事务的传播机制来指定处理方式。

在TransactionDefinition定义中包括了如下几个表示传播行为的常量:

常量

含义

TransactionDefinition.PROPAGATION_REQUIRED

如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。

TransactionDefinition.PROPAGATION_REQUIRES_NEW

创建一个新的事务,如果当前存在事务,则把当前事务挂起。

TransactionDefinition.PROPAGATION_SUPPORTS

如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

TransactionDefinition.PROPAGATION_NOT_SUPPORTED

以非事务方式运行,如果当前存在事务,则把当前事务挂起。

TransactionDefinition.PROPAGATION_NEVER

以非事务方式运行,如果当前存在事务,则抛出异常。

TransactionDefinition.PROPAGATION_MANDATORY

如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

TransactionDefinition.PROPAGATION_NESTED

如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

事务补充:

同一个事务里面,对某一条数据的增删改、 都会影响到这个事务里面接下来的对这个条数的增删改查,如(举例部分情况):

阿里piapia规范推荐:

事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。

如:使用

代替:

阿里推荐的方式属于自动提交/手动回滚,那如果我们想要手动提交、手动回滚的话,可参考:

注:不需要@Transactional注解。

以上这篇SpringBoot声明式事务的简单运用说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java交换排序之鸡尾酒排序实现方法

    java交换排序之鸡尾酒排序实现方法

    这篇文章主要介绍了java交换排序之鸡尾酒排序实现方法,实例分析了排序的原理与相关的实现技巧,需要的朋友可以参考下
    2015-02-02
  • springboot关闭druid监控 druid2改配置文件无效的解决

    springboot关闭druid监控 druid2改配置文件无效的解决

    这篇文章主要介绍了springboot关闭druid监控 druid2改配置文件无效的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java并发编程之Semaphore的使用简介

    Java并发编程之Semaphore的使用简介

    这篇文章主要介绍了Java并发编程之Semaphore的使用简介,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04
  • 在Spring Data JPA中引入Querydsl的实现方式

    在Spring Data JPA中引入Querydsl的实现方式

    这篇文章主要介绍了在Spring Data JPA中引入Querydsl的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Idea去除方法形参参数提示的操作

    Idea去除方法形参参数提示的操作

    这篇文章主要介绍了Idea去除方法形参参数提示的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • SpringBoot快速设置拦截器并实现权限验证的方法

    SpringBoot快速设置拦截器并实现权限验证的方法

    本篇文章主要介绍了SpringBoot快速设置拦截器并实现权限验证的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Java Lombok简介、使用、工作原理、优缺点

    Java Lombok简介、使用、工作原理、优缺点

    这篇文章主要介绍了Java Lombok简介、使用、工作原理、优缺点的相关资料,帮助大家更好的理解和学习使用Java Lombok,感兴趣的朋友可以了解下
    2021-03-03
  • Mybatis延迟加载的实现方式

    Mybatis延迟加载的实现方式

    这篇文章主要介绍了Mybatis延迟加载的实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java中ArrayList删除的常用操作及方法

    Java中ArrayList删除的常用操作及方法

    ArrayList是最常用的一种java集合,在开发中我们常常需要从ArrayList中删除特定元素,本文主要介绍了Java中ArrayList删除的常用操作及方法,感兴趣的可以了解一下
    2023-11-11
  • Spring Boot异常处理问题小结

    Spring Boot异常处理问题小结

    在 Spring Boot 中,异常处理是一个重要的部分,可以允许开发者优雅地处理应用程序中可能发生的错误和异常,这篇文章主要介绍了Spring Boot异常处理问题小结,需要的朋友可以参考下
    2024-05-05

最新评论