SpringBoot 中 @Transactional 的使用
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 的使用相关推荐
- springboot中使用@Transactional注解事物不生效的原因
一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声 ...
- springboot中得注解_Spring以及SpringBoot中的常用的注解小结
一.注解的基本概念 Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法.Annotion(注解)是一个接口,程序可以通过反射来获 ...
- SpringBoot学习笔记(9)----SpringBoot中使用关系型数据库以及事务处理
在实际的运用开发中,跟数据库之间的交互是必不可少的,SpringBoot也提供了两种跟数据库交互的方式. 1. 使用JdbcTemplate 在SpringBoot中提供了JdbcTemplate模板 ...
- 面试官 | SpringBoot 中如何实现异步请求和异步调用?
作者 | 会炼钢的小白龙 来源 | cnblogs.com/baixianlong/p/10661591.html 一.SpringBoot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放 ...
- springboot中缓存技术的使用、原理及其运行流程
Springboot中缓存的工作原理 要想在springboot中使用缓存,首先要了解springboot中缓存的工作原理. 我们知道springboot在启动时会有很多的自动配置类(xxx-Auto ...
- SpringBoot使用@Transactional
今天在写添加用户时发现一个问题,现进行总结,以后遇到事务的相关问题会继续补充. 业务:新增用户时,需要对用户详细信息进行保存USER表,还要对用户的角色进行保存USER_ROLE表(一对多). 此时就 ...
- Shiro的在Springboot中的使用
一.Shiro简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.使用Shiro的易于理解的API,您可以快速.轻松地获得任何应用程序,从最小的移动应 ...
- (附源码)springboot中北创新创业官网 毕业设计 271443
Springboot中北创新创业官网 摘 要 进入21世纪以来,计算机有了迅速的发展.计算机应用.信息技术全面渗透到了人类社会的各个方面,信息化已成为世界经济和社会发展的大趋势.本文主要通过对中北创新 ...
- SpringBoot 中的验证码、二维码、缩略图、图片上传、定时器调度
1.验证码生成 pom.xml 文件中添加依赖: <dependency><groupId>com.github.penggle</groupId><arti ...
最新文章
- 学完HTML5后可以开发哪些互联网产品呢?
- android+百度lbs云,百度——LBS.云 v2.0——云存储扩展字段——Android
- 2009年上半年网络工程师考试下午试卷参考答案(二)
- Go圣经-学习笔记之复合类型(二)
- codova添加android慢_从 0 开始学 Linux 内核之 android 内核栈溢出 ROP 利用
- Nginx之location详解
- 智能家居形态逐步演进 机会与挑战并存
- Simulink代码生成基础体验教程
- 电压电流测量模块在matlab,MATLAB仿真时用simulink的RMS模块测量电压有效值,总提示如下警告,怎么破,跪求?...
- 【Uplift】模拟数据篇
- 适合学生党的蓝牙耳机品牌有哪些?性价比高的无线耳机推荐
- 安天 - 网络安全管培生一面
- javaSE-day04--ArrayList基本用方法、类内定义方法和方法重载、静态方法static(类的方法)、工具方法(static)的定义和使用
- 老九学堂数据结构与算法章节1课堂笔记
- android 文字转语音(中文) TextSpeech
- git克隆时出现not fount问题
- 你和真努力还差这几点
- 搭建git服务器及利用git hook自动布署代码
- 中文词向量的下载与使用探索 (tensorflow加载词向量)
- Win11 Build22499.1000预览版更新,可快速共享应用窗口到Microsoft Teams【附win11原版iso镜像地址】
热门文章
- spark原理和spark与mapreduce的最大区别
- VMware网络连接模式—桥接、NAT以及仅主机模式的详细介绍和区别
- pgsql merge方法
- Transact-SQL 存储过程(c#调用执行)
- 关于javaswing做的游戏的一点小总结x
- ODP.NET连接池性能计数器
- Delphi 2009 的反射单元(ObjAuto):
- 五分钟学会python编程_每天五分钟python编程:生成器技术是python语言最强大的技术之一...
- C语言之如何理解指针的指针(九)
- 可视化理解卷积神经网络