Javaweb之SpringBootWeb案例之事务进阶的详细解析

时间:2024-02-11 23:51:10 标签:  进阶  

1.3 事务进阶

前面我们通过spring事务管理注解@Transactional已经控制了业务层方法的事务。接下来我们要来详细的介绍一下@Transactional事务管理注解的使用细节。我们这里主要介绍@Transactional注解当中的两个常见的属性:

  1. 异常回滚的属性:rollbackFor

  2. 事务传播行为:propagation

我们先来学习下rollbackFor属性。

1.3.1 rollbackFor

我们在之前编写的业务方法上添加了@Transactional注解,来实现事务管理。

@Transactional
public void delete(Integer id){//根据部门id删除部门信息deptMapper.deleteById(id);//模拟:异常发生int i = 1/0;
​//删除部门下的所有员工信息empMapper.deleteByDeptId(id);   
}

以上业务功能delete()方法在运行时,会引发除0的算数运算异常(运行时异常),出现异常之后,由于我们在方法上加了@Transactional注解进行事务管理,所以发生异常会执行rollback回滚操作,从而保证事务操作前后数据是一致的。

下面我们在做一个测试,我们修改业务功能代码,在模拟异常的位置上直接抛出Exception异常(编译时异常)

@Transactional
public void delete(Integer id) throws Exception {//根据部门id删除部门信息deptMapper.deleteById(id);//模拟:异常发生if(true){throw new Exception("出现异常了~~~");}
​//删除部门下的所有员工信息empMapper.deleteByDeptId(id);   
}

说明:在service中向上抛出一个Exception编译时异常之后,由于是controller调用service,所以在controller中要有异常处理代码,此时我们选择在controller中继续把异常向上抛。

@DeleteMapping("/depts/{id}")
public Result delete(@PathVariable Integer id) throws Exception {
//日志记录
log.info("根据id删除部门");
//调用service层功能
deptService.delete(id);
//响应
return Result.success();
}

重新启动服务后测试:

抛出异常之后事务会不会回滚

现有表中数据:

使用postman测试,删除5号部门

发生了Exception异常,但事务依然提交了

dept表中数据:

通过以上测试可以得出一个结论:默认情况下,只有出现RuntimeException(运行时异常)才会回滚事务。

假如我们想让所有的异常都回滚,需要来配置@Transactional注解当中的rollbackFor属性,通过rollbackFor这个属性可以指定出现何种异常类型回滚事务。

@Slf4j
@Service
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;
​@Autowiredprivate EmpMapper empMapper;
​@Override@Transactional(rollbackFor=Exception.class)public void delete(Integer id){//根据部门id删除部门信息deptMapper.deleteById(id);//模拟:异常发生int num = id/0;
​//删除部门下的所有员工信息empMapper.deleteByDeptId(id);   }
}

接下来我们重新启动服务,测试删除部门的操作:

控制台日志:执行了删除3号部门的操作, 因为异常又进行了事务回滚

数据表:3号部门没有删除

结论:

  • 在Spring的事务管理中,默认只有运行时异常 RuntimeException才会回滚。

  • 如果还需要回滚指定类型的异常,可以通过rollbackFor属性来指定。

1.3.3 propagation
1.3.3.1 介绍

我们接着继续学习@Transactional注解当中的第二个属性propagation,这个属性是用来配置事务的传播行为的。

什么是事务的传播行为呢?

  • 就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。

例如:两个事务方法,一个A方法,一个B方法。在这两个方法上都添加了@Transactional注解,就代表这两个方法都具有事务,而在A方法当中又去调用了B方法。

所谓事务的传播行为,指的就是在A方法运行的时候,首先会开启一个事务,在A方法当中又调用了B方法, B方法自身也具有事务,那么B方法在运行的时候,到底是加入到A方法的事务当中来,还是B方法在运行的时候新建一个事务?这个就涉及到了事务的传播行为。

我们要想控制事务的传播行为,在@Transactional注解的后面指定一个属性propagation,通过 propagation 属性来指定传播行为。接下来我们就来介绍一下常见的事务传播行为。

属性值含义
REQUIRED【默认值】需要事务,有则加入,无则创建新事务
REQUIRES_NEW需要新事务,无论有无,总是创建新事务
SUPPORTS支持事务,有则加入,无则在无事务状态中运行
NOT_SUPPORTED不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
MANDATORY必须有事务,否则抛异常
NEVER必须没事务,否则抛异常

对于这些事务传播行为,我们只需要关注以下两个就可以了:

  1. REQUIRED(默认值)

  2. REQUIRES_NEW

 

来源:分享自作者个人站点/博客

智能推荐

1.3 事务进阶 前面我们通过spring事务管理注解@Transactional已经控制了业务层方法的事务。接下来我们要来详细的介绍一下@Transactional事务管理注解的使用细节。我们这里主要介绍@Transactional注解当中的两个常见的属性: 异常回滚的属性:rollbackFor 事务传播行为:propagation 我们先来学习下rollbackFor属性。 1.3.1 rollbackFor 我们在之前编写的业务方法上添加了@Tr

标签:进阶  

1. 事务管理 1.1 事务回顾 在数据库阶段我们已学习过事务了,我们讲到: 事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功,要么同时失败。 怎么样来控制这组操作,让这组操作同时成功或同时失败呢?此时就要涉及到事务的具体操作了。 事务的操作主要有三步: 开启事务(一组操作开始前,开启事务&#xff

标签:事务管理  

SpringBootWeb案例 前面我们已经讲解了Web前端开发的基础知识,也讲解了Web后端开发的基础(HTTP协议、请求响应),并且也讲解了数据库MySQL,以及通过Mybatis框架如何来完成数据库的基本操作。 那接下来,我们就通过一个案例,来将前端开发、后端开发、数据库整合起来。 而这个案例呢,就是我们前面提到的Tlias智能学习辅助系统。

标签:案例  

4.3 @ConfigurationProperties 讲解完了yml配置文件之后,最后再来介绍一个注解@ConfigurationProperties。在介绍注解之前,我们先来看一个场景,分析下代码当中可能存在的问题: 我们在application.properties或者application.ym

标签:案例  

2.3 阿里云OSS 2.3.1 准备 阿里云是阿里巴巴集团旗下全球领先的云计算公司,也是国内最大的云服务提供商 。 云服务指的就是通过互联网对外提供的各种各样的服务,比如像:语音服务、短信服务、邮件服务、视频直播服务、文字识别服务、对象存储服务等等。 当我们在项目开发时需要用到某个或某些服务&#xf

标签:阿里  

3.1.2 分页插件 3.1.2.1 介绍 前面我们已经完了基础的分页查询,大家会发现:分页查询功能编写起来比较繁琐。 在Mapper接口中定义两个方法执行两条不同的SQL语句: 查询总记录数 指定页码的数据列表

标签:分页  

2.2 本地存储 前面我们已分析了文件上传功能前端和后端的基础代码实现,文件上传时在服务端会产生一个临时文件,请求响应完成之后,这个临时文件被自动删除,并没有进行保存。下面呢,我们就需要完成将上传的文件保存在服务器的本地磁盘上。 代码实现: 在服务器本地磁盘上创建images目录,用来存储上传的文件(例:E盘创建images目录) 使用MultipartFile类提供的API方法,把临时文件转存到本地磁盘目录下

标签:案例  

2. 文件上传 在我们完成的新增员工功能中,还存在一个问题:没有头像(图片缺失) 上述问题,需要我们通过文件上传技术来解决。下面我们就进入到文件上传技术的学习。 文件上传技术这块我们主要讲解三个方面:首先我们先对文件上传做一个整体的介绍,接着再学习文件上传的本地存储方式,最后学习云存储方式。

标签:文件上传  

4.2 yml配置文件 前面我们一直使用springboot项目创建完毕后自带的application.properties进行属性的配置,那其实呢,在springboot项目当中是支持多种配置方式的,除了支持properties配置文件以外,还支持另外一种类型的配置文件,就是我们接下来要讲解的yml格式的配置文件。 application.properties server.port=8080server.address=127.0.0.1 application.yml

标签:配置文件  

2.3.2 入门 阿里云oss 对象存储服务的准备工作我们已经完成了,接下来我们就来完成第二步操作:参照官方所提供的sdk示例来编写入门程序。 首先我们需要来打开阿里云OSS的官方文档,在官方文档中找到 SDK 的示例代码:

标签:阿里  

2.3.3 集成 阿里云oss对象存储服务的准备工作以及入门程序我们都已经完成了,接下来我们就需要在案例当中集成oss对象存储服务,来存储和管理案例中上传的图片。 在新增员工的时候,上传员工的图像,而之所以需要上传员工的图像,是因为将来我们需要在系统页面当中访问并展示员工的图像。而要想完成这个操作&#xff

标签:阿里  

2. JDBC介绍(了解) 2.1 介绍 通过Mybatis的快速入门,我们明白了,通过Mybatis可以很方便的进行数据库的访问操作。但是大家要明白,其实java语言操作数据库呢,只能通过一种方式:使用sun公司提供的 JDBC 规范。 Mybatis框架,就是对原始的JDBC程序的封装。 那到底什么是JDBC呢,接下来,我们就来介绍一下。 JDBC: ( Java DataBase Connectivity )&#x

标签:详细  

3. Mybatis动态SQL 3.1 什么是动态SQL 在页面原型中,列表上方的条件是动态的,是可以不传递的,也可以只传递其中的1个或者2个或者全部。 而在我们刚才编写的SQL语句中,我们会看到,我们将三个条件直接写死了。 如果页面只传递了参数姓名name 字段,其他两个字段 性别 和 入职时间

标签:动态  

1. Mybatis基础操作 学习完mybatis入门后,我们继续学习mybatis基础操作。 1.1 需求 需求说明

标签:操作  

2. Mybatis的XML配置文件 Mybatis的开发有两种方式: 注解 XML 2.1 XML配置文件规范 使用Mybatis的注解方式,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就是将SQL语句写在XML配置文件中。 在Mybatis中使用XML映射文件方式开发,需要符合一定的规范: XML映射文件的名称与Mapper接口名称一致,并

标签:配置文件  

1.6 查询 1.6.1 根据ID查询 在员工管理的页面中,当我们进行更新数据时,会点击 “编辑” 按钮,然后此时会发送一个请求到服务端,会根据Id查询该员工信息,并将员工数据回显在页面上。 SQL语句:

标签:操作  

1.6 查询 1.6.1 根据ID查询 在员工管理的页面中,当我们进行更新数据时,会点击 “编辑” 按钮,然后此时会发送一个请求到服务端,会根据Id查询该员工信息,并将员工数据回显在页面上。 SQL语句: select id,

标签:操作  

目录 SpringBootWeb请求响应2. 响应2.1 @ResponseBody2.2 统一响应结果2.3 案例

标签:示例  

1.4 新增 功能:新增员工信息 1.4.1 基本新增 员工表结构: SQL语句&#x

标签:操作  

个人主页:点我进入主页 专栏分类:C语言初阶  C语言进阶  数据结构初阶    Linux    C++初阶     欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂   目录   一.前言 二.类的定义和使用

标签:对象  

准备工作 需求说明 部门管理   部门管理功能开发包括:查询部门列表、删除部门、新增部门、修改部门   员工管理功能开发包括:查询员工列表(分页、条件)、删除员工、新增员工、修改员工

标签:案例  

目录 SpringBootWeb案例011. 准备工作1.1 需求&环境搭建1.1.1 需求说明1.1.2 环境搭建

标签:示例  

一、数据库事务 数据库事务是访问并可能操作数据项的一个数据库操作序列,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作完成·。 通俗的来讲,就是一次对数据库操作过程,这个过程由多条sql执行,这么多条sql在一次执行过程中要么都成功执行么都不执行,保证数据完整性。mysql中只有innodb引擎支持事务。 二、事务的特性 原

标签:进阶  

个人主页:点我进入主页 专栏分类:C语言初阶  C语言进阶  数据结构初阶    Linux    C++初阶     欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录

标签:入门  

个人主页:点我进入主页 专栏分类:C语言初阶  C语言进阶  数据结构初阶    Linux    C++初阶     欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录

标签:函数  

猜你喜欢

情况描述:  ---打包不成功 这时点击Maven中的蓝色小闪电: 小闪电的意思:是否跳过测试。点击选中就可以

标签:解决方案  

在之前的C++入门的博客中我们就学习到了模板初阶,今天我们来学习模板的进阶,以便于更好地将模板运用到代码中 非类型模板参数 模板参数分类类型形参与非类型形参。

标签:进阶  

目录 SpringBootWeb案例022. 部门管理2.1 查询部门2.1.1 原型和需求2.1.2 接口文档

标签:示例  

目录 SpringBootWeb案例033. 员工管理3.1 分页查询3.1.1 基础分页3.1.1.1 需求分

标签:示例  

目录 SpringBootWeb案例054. 配置文件4.1 参数配置化4.2 yml配置文件4.3 @ConfigurationPro

标签:示例  

目录 SpringBootWeb案例063. 修改员工3.1 查询回显3.1.1 接口文档3.1.2 实现思路

标签:示例  

目录 SpringBootWeb案例041. 新增员工1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发

标签:示例  

SAP MM 初阶之事务代码MIBC 某零售行业SAP项目里,业务人员提出SAP系

标签:事务  代码  SAP  MM  MIBC  

引言上一个章节说了什么是事务,在MySQL数据库中如何查询事务,以及哪些存储引擎支持事务。这一章节来说说事务的隔离。上一篇传送:MySQL进阶|MySQL中的事务(一)在这里插入图片描述

标签:进阶  事务  mysql  

目录 前言 @Transactional 应用在非 public 修饰的方法上

标签:之路  

文章目录 1 Loki1.1 引言1.2 Loki工作方式1.2.1 日志解析格式1.2.2 日志搜集架构模式1.2.3 Lo

标签:详细  

1.进入douphp的安装界面 www.douphp.com/install/

标签:漏洞  

遮罩,顾名思义是一种可以掩盖其它元素的控件。常用于修改其它元素的外观,或限制元素的形状。比如ScrollView或者圆头像效果都有用到遮罩功能。本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实现原理,以及通过Unity不同遮罩之间实现方式的对比,找到每一种遮罩的最佳使用场合。本文是UGUI遮罩系列的第二篇,专门解读RectMask2D遮罩。另外两篇分别是【UGUI源码分析】Unity遮罩之Mask详细解读Unity遮罩之Mask、RectMask2D与Sprite Mask适用场景分析本文使用的源码与内置资源均基于Unity2019.4版本

标签:源码  详细  UGUI  RectMask2D  Unity  

遮罩,顾名思义是一种可以掩盖其它元素的控件。常用于修改其它元素的外观,或限制元素的形状。比如ScrollView或者圆头像效果都有用到遮罩功能。本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实现原理,以及通过Unity不同遮罩之间实现方式的对比,找到每一种遮罩的最佳使用场合。Unity UGUI主要提供两种遮罩,分别是Mask和Rect Mask 2D。在2D游戏开发中,可能还会用到Sprite Mask,虽然不是本文的重点,但后面也会提到。原本是希望将对各个遮罩的分析与对比整合在一篇文章中,但在书写过程中发现篇幅过长,因此只好拆分为三个部分。本篇文章是第一部分

标签:源码  详细  UGUI  MASK  Unity  

五、案例 1. 开发规范—Restful REST(Representational State Transfer),表述性状态转换,是一种软件架构风格

标签:后端  

事务 事务由单独单元的一个或多个SQL语句组成,在这 个单元中,每个MySQL语句是相互依赖的。而整个单独单 元作为一个不可分割的整体,如果单元中某条SQL语句一 旦执行失败或产生错误,整个单元将会回滚。所有受到影 响的数据将返回到事物开始以前的状态;如果单元中的所 有SQ

标签:进阶  

个人主页:点我进入主页 专栏分类:C语言初阶  C语言进阶  数据结构初阶    Linux    C++初阶     欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录

标签:语法  

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复 「资料」 可领取编程高频电子书&#x

标签:进阶  

1、JdbcTemplateSpring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作spring 1.1 准备工作

标签:事务  spring  

1 编写转账案例,引出事务管理问题 需求:账号转账,Tom账号取出1000元,存放到Jack账号上 1.1 建表脚本(MySQL) CREATE TABLE t_account (id INT(11) NOT NULL

标签:事务管理  

1 编写转账案例,引出事务管理问题 需求:账号转账,Tom账号取出1000元,存放到Jack账号上 1.1 建表脚本(MySQL) CREATE TABLE t_account ( id INT(11) NOT NU

标签:事务管理  

SAP MM 初阶之不常用事务代码MEBV 今天从一个同行那里听到事务代码MEBV

标签:常用  事务  代码  SAP  MM  

前言本文主要讲述单例模式,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。一. 什么是单例模式单例模式是23种设计模式中创建型模式的一种,通过单例模式的方法创建的类在当前进程或者线程中只有一个实例。单例模式有两种比较常见的实现方式:饿汉式、懒汉式二. 生活中的单例模式1. 父母古语有云:身体发肤,受之父母。咱们每个人包括

标签:模式  详解  无二  事物  java  

相关问题

相关文章

热门文章

推荐文章

相关标签