• SpringBoot声明式事务(转)


    前言

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

    SpringBoot使用事物的步骤:

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

    image
    提示:

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

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

    image
    给出Transactional 注解的常用属性表:
    image
    注意事项:
    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定义中包括了如下几个表示传播行为的常量:
    image

    事务补充:

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

    阿里piapia规范推荐:

    事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。
    如:使用
    image
    代替:
    image
    阿里推荐的方式属于自动提交/手动回滚,那如果我们想要手动提交、手动回滚的话,可参考:
    image
    注:不需要@Transactional注解。
    使用声明式注解时,除了抛出异常外,我们还可以主动设置事务需要回滚:
    image

    原文链接:https://blog.csdn.net/justry_deng/article/details/80828180

  • 相关阅读:
    【转】WINDOWS消息响应,以及处理分派机制
    web服务器分析与设计(四)
    c++ 概念及学习/c++ concept&learning(三)
    c++ 概念及学习/c++ concept&learning(二)
    【重读】The C++ Programming Language/C++编程语言(一)
    web服务器分析与设计(三)
    web服务器分析与设计(二)
    web服务器分析与设计(一)
    c++ 概念及学习/c++ concept&learning(一)
    windows服务1053错误排查
  • 原文地址:https://www.cnblogs.com/kaka-qiqi/p/15456890.html
Copyright © 2020-2023  润新知