1.spring boot 中事物的使用 (当前指代的不是多数据源,只有一个数据源的前提下)

<1> 在springboot 启动类上加上允许使用事物注解

@EnableTransactionManagement
<2> 就这么简单的一个操作,更主要的是了解@Transactional 的一些特性,到底该怎么使用,什么时候使用。

事物的四个特性想必大家应该都知道,原子性(最小的整体,不可分割),一致性(都成功或都失败),隔离性(事物间互不干扰),持久性(保存的数据库)。

原子性 (atomicity):强调事务的不可分割。
一致性 (consistency):事务的执行的前后数据的完整性保持一致。
隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰 。
持久性(durability) :事务一旦结束,数据就持久到数据库。
<3> 进到@Transactional 注解中看一下

propagation:该属性用于设置事务的传播行为。

isolation:该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置

timeout:该属性用于设置事务的超时秒数(单位为秒),默认值为-1表示永不超时

readOnly:该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。

rollbackFor:

该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:

指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})

rollbackForClassName:

该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:

指定单一异常类名称:@Transactional(rollbackForClassName=“RuntimeException”)

指定多个异常类名称:@Transactional(rollbackForClassName={“RuntimeException”,“Exception”})

noRollBackFor:

该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:

指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})

noRollBackForClassName:

该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:

指定单一异常类名称:@Transactional(noRollbackForClassName=“RuntimeException”)

指定多个异常类名称:@Transactional(noRollbackForClassName={“RuntimeException”,“Exception”})

<4>下面需要了解一下事物传播属性中可以设置的值 Propagation是一个枚举类

public enum Propagation {
REQUIRED(0),
SUPPORTS(1),
MANDATORY(2),
REQUIRES_NEW(3),
NOT_SUPPORTED(4),
NEVER(5),
NESTED(6);

private final int value;private Propagation(int value) {this.value = value;
}public int value() {return this.value;
}

}
如上,是spring boot 或者说spring支持的7中事物传播级别,说一下不同的隔离级别以及使用场景,

在说下文之前,我要说一下,事物传播,传播的意思指代为被调用者将事物传递到调用者。这个过程为事物的传播过程。这句话我想如果理解会更好的理解这几种事物传播行为。

REQUIRED: 表示当前方法必须在一个具有事物的上下文中运行,如果客户端有事物,那么被调用端将在该事物中运行,否则的话重新开启一个事物,如果被调用端发生异常,那么调用端和被调用端事物都将回滚。

模拟一个场景(在俩个不同的servies中,PS:为什么指代发生在俩个类中,现在所有对象都交由Spring统一管理,而只有在代理对象之间进行调用的时候才能触发切面逻辑,跟踪代码的时候会发现,优先进入的CglibAopProxy代理类…)

俩个业务 A业务修改一个参数值改为150 ,B业务随后将该值改为1500。

/** 业务A */
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
public void transTest() {ParkParam parkParam1 = new ParkParam();parkParam1.setParamId(1);parkParam1.setParamValue("150");parkParamMapper.updateById(parkParam1);//调用业务B  parkCarService.testTrans();}/**业务B*/
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
public void testTrans() {ParkParam parkParam2 = new ParkParam();parkParam2.setParamId(1);parkParam2.setParamValue("1500");parkParamMapper.updateById(parkParam2);//模拟抛出异常int a = 9/0;
}

OK,这是很正常的代码逻辑,结果也和大家想想中的一样,B发生异常,AB俩段逻辑同时回滚。但是如果我将调用B的逻辑try,catch 住。那这时候A会正常提交吗?我把A的业务逻辑改成如下。

/**
* 业务A
*/
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
public void transTest() {
ParkParam parkParam1 = new ParkParam();
parkParam1.setParamId(1);
parkParam1.setParamValue(“150”);
parkParamMapper.updateById(parkParam1);
try {
parkCarService.testTrans();
} catch (Exception e) {
e.printStackTrace();
}

}

按照如上的代码:抛出如下异常 Transaction rolled back because it has been marked as rollback-only;数据库中数据也没有被修改。总结一下,spring boot 默认的事物即发生异常无论是否捕获均会回滚。

SUPPORTS: 表示当前方法不需要具有一个事物上下文,当时如果有一个事物的话,它也可以在事物中运行。

A有事物(required)+ B有事物(supports)+ B异常:AB同时回滚。

A有事物(required)+ B有事物(supports)+ B异常 + A捕获:AB同时回滚,抛出Transaction rolled back because it has been marked as rollback-only异常。

MANDATORY(强制性):表示当前方法必须在一个事务中运行,如果没有事务,将抛出异常。

A事物(必须)+ B事物(mandatory):必须同时具备事物。

NESTED(嵌套):表示如果业务A如果有事物,则业务B运行在一个嵌套事物中,被嵌套的事物可以独立于被封装的事物中提交或者回滚,但是如果业务A抛出异常回滚,嵌套事物必须回滚,反之,嵌套事物回滚,业务A不需要回滚。

A无事物 + B(nested) + B异常 :业务A不回滚,业务B回滚。

A无事物 + B(nested)+ A异常 :AB都不回滚。

A有事物 + B(nested) + A异常:AB都回滚。

A有事物 + B(nested)+B异常 : AB都回滚。

A有事物 + B(nested) + B异常 + A捕获 : A不回滚 B回滚。

NEVER(永不): 不运行在事物环境中。

REQUIRES-NEW : 表示当前方法必须运行在它自己的事务中。一个新的事务将启动,而且如果有一个现有的事务在运行的话,则这个方法将在运行期被挂起,直到新的事务提交或者回滚才恢复执行。

A有事物(required)+ B有事物(requires_new)+ A异常: A回滚,B不受影响。

A有事物(required)+ B有事物(requires_new)+ B异常: AB回滚。

A有事物(required)+ B有事物(requires_new)+ B异常 + A 捕获: A不受影响,B回滚。

NOT_SUPPORT:

A无事物B有事物(not_support)+ B异常:A不回滚,B回滚。

A有事物(required)B有事物(not_support)+ A异常: A回滚,B不回滚。

A有事物(required)try catch,B有事物(not_support)+ B异常:AB都不回滚。

以上就是测试spring boot 事物的传播方式。如果有不对的地方,希望大家指出,开发小白一枚;

SpringBoot 中 @Transactional 的使用相关推荐

  1. springboot中使用@Transactional注解事物不生效的原因

    一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声 ...

  2. springboot中得注解_Spring以及SpringBoot中的常用的注解小结

    一.注解的基本概念 Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法.Annotion(注解)是一个接口,程序可以通过反射来获 ...

  3. SpringBoot学习笔记(9)----SpringBoot中使用关系型数据库以及事务处理

    在实际的运用开发中,跟数据库之间的交互是必不可少的,SpringBoot也提供了两种跟数据库交互的方式. 1. 使用JdbcTemplate 在SpringBoot中提供了JdbcTemplate模板 ...

  4. 面试官 | SpringBoot 中如何实现异步请求和异步调用?

    作者 | 会炼钢的小白龙 来源 | cnblogs.com/baixianlong/p/10661591.html 一.SpringBoot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放 ...

  5. springboot中缓存技术的使用、原理及其运行流程

    Springboot中缓存的工作原理 要想在springboot中使用缓存,首先要了解springboot中缓存的工作原理. 我们知道springboot在启动时会有很多的自动配置类(xxx-Auto ...

  6. SpringBoot使用@Transactional

    今天在写添加用户时发现一个问题,现进行总结,以后遇到事务的相关问题会继续补充. 业务:新增用户时,需要对用户详细信息进行保存USER表,还要对用户的角色进行保存USER_ROLE表(一对多). 此时就 ...

  7. Shiro的在Springboot中的使用

    一.Shiro简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.使用Shiro的易于理解的API,您可以快速.轻松地获得任何应用程序,从最小的移动应 ...

  8. (附源码)springboot中北创新创业官网 毕业设计 271443

    Springboot中北创新创业官网 摘 要 进入21世纪以来,计算机有了迅速的发展.计算机应用.信息技术全面渗透到了人类社会的各个方面,信息化已成为世界经济和社会发展的大趋势.本文主要通过对中北创新 ...

  9. SpringBoot 中的验证码、二维码、缩略图、图片上传、定时器调度

    1.验证码生成 pom.xml 文件中添加依赖: <dependency><groupId>com.github.penggle</groupId><arti ...

最新文章

  1. 学完HTML5后可以开发哪些互联网产品呢?
  2. android+百度lbs云,百度——LBS.云 v2.0——云存储扩展字段——Android
  3. 2009年上半年网络工程师考试下午试卷参考答案(二)
  4. Go圣经-学习笔记之复合类型(二)
  5. codova添加android慢_从 0 开始学 Linux 内核之 android 内核栈溢出 ROP 利用
  6. Nginx之location详解
  7. 智能家居形态逐步演进 机会与挑战并存
  8. Simulink代码生成基础体验教程
  9. 电压电流测量模块在matlab,MATLAB仿真时用simulink的RMS模块测量电压有效值,总提示如下警告,怎么破,跪求?...
  10. 【Uplift】模拟数据篇
  11. 适合学生党的蓝牙耳机品牌有哪些?性价比高的无线耳机推荐
  12. 安天 - 网络安全管培生一面
  13. javaSE-day04--ArrayList基本用方法、类内定义方法和方法重载、静态方法static(类的方法)、工具方法(static)的定义和使用
  14. 老九学堂数据结构与算法章节1课堂笔记
  15. android 文字转语音(中文) TextSpeech
  16. git克隆时出现not fount问题
  17. 你和真努力还差这几点
  18. 搭建git服务器及利用git hook自动布署代码
  19. 中文词向量的下载与使用探索 (tensorflow加载词向量)
  20. Win11 Build22499.1000预览版更新,可快速共享应用窗口到Microsoft Teams【附win11原版iso镜像地址】

热门文章

  1. spark原理和spark与mapreduce的最大区别
  2. VMware网络连接模式—桥接、NAT以及仅主机模式的详细介绍和区别
  3. pgsql merge方法
  4. Transact-SQL 存储过程(c#调用执行)
  5. 关于javaswing做的游戏的一点小总结x
  6. ODP.NET连接池性能计数器
  7. Delphi 2009 的反射单元(ObjAuto):
  8. 五分钟学会python编程_每天五分钟python编程:生成器技术是python语言最强大的技术之一...
  9. C语言之如何理解指针的指针(九)
  10. 可视化理解卷积神经网络