SpringBoot声明式事务的简单运用

SpringBoot声明式事务的简单运用关于事物的基本概念等这里就不介绍了。Spring声明式事物的实现,有两种方式;第一种是配置xml,第二种是使用相关注解(这两种方式可详见《程序员成长笔记(一)》的相关章节)。SpringBoot中默认配置了第二种方式,所以,SpringBoot直接使用注解即可。下面介绍SpringBoot通过注解开启事物的使用。SpringBoot使用事物的步骤:第一步:在启动类上开启…

大家好,又见面了,我是你们的朋友全栈君。

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

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

SpringBoot使用事物的步骤:

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

SpringBoot声明式事务的简单运用

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

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

SpringBoot声明式事务的简单运用


给出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。


事务补充:

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

示例

结论

一个事务里面,debug未完成时, 数据会入库吗?

不会

一个事务里面,执行一半时,程序莫名停了,数据会回滚吗?

会

同一个事务里面,插入(数据a) -> 查询(数据a) -> 修改(数据a) -> 插入(数据a),可以吗?

可以

同一个事务里面,插入(数据a) -> 修改(数据a) -> 再次修改(数据a) -> 查询(数据a),可以吗?

可以

同一个事务里面,插入(数据a) -> 修改(数据a) -> 删除(数据a),可以吗?

可以

……

 


阿里piapia规范推荐:

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

如:使用

SpringBoot声明式事务的简单运用

代替:

SpringBoot声明式事务的简单运用

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

SpringBoot声明式事务的简单运用

注:不需要@Transactional注解。


使用声明式注解时,除了抛出异常外,我们还可以主动设置事务需要回滚:

SpringBoot声明式事务的简单运用

 

 

^_^ 参考链接:
           
https://blog.csdn.net/KokJuis/article/details/78560814
           
http://www.voidcn.com/article/p-bozwatyd-st.html
           https://www.ibm.com/de…actional-use/

^_^ 如有不当之处,欢迎指正

^_^ 本文已经被收录进《程序员成长笔记(二)》,作者JustryDeng

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138748.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CentOS 6.4安装(超级详细图解教程)

    CentOS 6.4安装(超级详细图解教程)说明:1、CentOS6.4系统镜像有两个,安装系统只用到第一个镜像即CentOS-6.4-i386-bin-DVD1.iso(32位)或者CentOS-6.4-x86_64-bin-DVD1.i

    2022年7月3日
  • 实例对比剖析c#引用参数的用法建议收藏

    c#引用参数传递的深入剖析值类型的变量存储数据,而引用类型的变量存储对实际数据的引用。(这一点很重要,明白了之后就能区分开值类型和引用类型的差别)在参数传递时,值类型是以值的形式传递的(传递的是值,对

    2021年12月21日
  • linux对外开放端口_如何通过命令开启端口

    linux对外开放端口_如何通过命令开启端口本文目录一、引言二、管理防火墙的命令2.1、开启防火墙2.1.1首先查看防火墙状态2.1.2开启防火墙2.1.3设置开机自启2.1.4重启防火墙2.1.5查看防火墙设置开机自启是否成功2.2、开启特定端口2.2.1添加端口2.2.2重新载入2.2.3查看2.2.4删除2.2.5关闭防火墙2.2.6查看开启的所有端口2.2.7查看服务的监听一、引言在Centos7.x中防火墙由firewalld来管理,以前为了方便,把防火墙都关闭了,因为现在项目

    2022年9月7日
  • ThinkPHP3.2 实现Mysql数据库备份

    ThinkPHP3.2 实现Mysql数据库备份

    2021年10月13日
  • 关于Web应用开发流程的总结「建议收藏」

    关于Web应用开发流程的总结「建议收藏」关于Web应用开发流程的总结

    2022年4月21日
  • JQuery 学习—$.each遍历学习

    生活在这样一个充满欢乐的世界中,我们要有欢乐的精神对待工作和生活! 我们每天晚上睡觉早上起来,每天会重复着做很多的事情,我们的生活在程序的角度看其实就是一个循环,这个循环说简单它就简单,说复杂它就很复杂。今天我要用欢乐的方式来介绍的是JQuery的中的一种技术,JQuery 的$.each遍历操作,不管是搞前端还是搞后端javaWeb方向的程序员(猿),一定会和它偶遇,在每一个转角。

    2022年2月25日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号