SpringBoot从小白到精通(十三)如何实现事务保存

简介: Spring Boot 整合完Mybatis,有个特别重要的功能之前忘记讲了:那就是Spring Boot如何实现事物控制。在我们的实际系统中,事务会被经常用到。特别是数据库操作或者是复杂的业务操作时,必须事物执行。必须保证本次业务的处理结果更改要么都成功,要么都失败。那么这种场景下,我们改如何实现呢?

前面介绍了Spring Boot 中的整合Mybatis并实现增删改查。不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html

Spring Boot 整合完Mybatis,有个特别重要的功能之前忘记讲了:那就是Spring Boot如何实现事物控制。在我们的实际系统中,事务会被经常用到。特别是数据库操作或者是复杂的业务操作时,必须事物执行。必须保证本次业务的处理结果更改要么都成功,要么都失败。那么这种场景下,我们改如何实现呢?

 

一、为什么要事务

以转账业务为例:一次转载业务涉及数据库表的两次更改。为确保业务完整性,需保证这两次更改要么都成功,要么都失败。否则账户金额就做了,后果非常严重。

image.png

 

二、事务播行为

Propagation.REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务,最常见的选择。

Propagation.SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行

Propagation.MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。

Propagation.REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起, 两个事务之间没有关系,一个异常,一个提交,不会同时回滚。

Propagation.NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

Propagation.NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常


三、Spring Boot实现事务

1、首先创建Spring Boot项目,并整合Mybatis相关的依赖。这个之前的文章讲过,大家可以看我这篇文章:《Spring Boot入门系列(六)Spring Boot如何整合Mybatis【附详细步骤


2、在需要事务的方法上添加 @Transactional注解,并通过propagation指定事务机制。

修改UserServiceImpl 类和UserService类,增加 saveUserTransactional 方法。

@Override
@Transactional(propagation = Propagation.REQUIRED)
public void saveUserTransactional(SysUser user) {
    userMapper.insert(user);
    int a = 1 / 0;
    user.setIsDelete(1);
    userMapper.updateByPrimaryKeySelective(user);
}

说明:

  • propagation = Propagation.REQUIRED是默认的事务机制,若当前有事务则支持当前事务,否则新建事务。
  • springboot 开启事物很简单,只需要加注解@Transactional即可。
  • @Transactional也可以加在类上,则该类所有方法都遵循该注解配置。


3、测试调用

在之前的MyBatisCRUDController增加测试方法:saveUserTransactional。

@RequestMapping("/saveUserTransactional")
    public JSONResult saveUserTransactional() {
        String userId = sid.nextShort();
        SysUser user = new SysUser();
        user.setId(userId);
        user.setUsername("weiz" + new Date());
        user.setNickname("weiz" + new Date());
        user.setPassword("abc123");
        user.setIsDelete(0);
        user.setRegistTime(new Date());
        userService.saveUserTransactional(user);
        return JSONResult.ok("保存成功");
    }

 

四、验证测试

首先我们看目前的sql数据中的数据,user表中数据如下:

image.png

 

然后,在浏览器中调用:http://localhost:8080/mybatis/saveUserTransactional 接口,查看数据库中数据的变化。

image.png可以看到,保存用户数据时,发生异常后,数据库中的数据也没有变化,说明数据已经回滚了。

 

最后

以上,就把Spring Boot中事物控制讲完了,是不是特别简单。这个系列课程的完整源码,也会提供给大家。

相关文章
|
Java 数据库连接 Spring
Springboot + mybatisPlus 的多数据源的事务
springboot开箱即用就不多说,mybatisplus强大的持久层插件,一键生成代码。这二者的结合可以使得开发效率大幅度提升。然而对于初学着,多数据源及多数据源下的事务的处理,可能让你头疼。
4429 0
|
Java Spring
面试突击82:SpringBoot 中如何操作事务?
面试突击82:SpringBoot 中如何操作事务?
330 0
|
消息中间件 Unix Java
SpringBoot整合RocketMQ发送事务消息
RocketMQ提供了类似X/Open XA的分布式事务功能,通过事务消息能达到分布式事务的最终一致。XA是一种分布式事务解决方案,一种分布式事务处理模式
1134 1
|
Java 关系型数据库 MySQL
面试突击86:SpringBoot 事务不回滚?怎么解决?
面试突击86:SpringBoot 事务不回滚?怎么解决?
338 0
|
消息中间件 Java 数据库连接
SpringBoot读写分离配置与事务
SpringBoot读写分离配置与事务
612 0
|
Java Spring
Springboot 跟着我了解下 事务 @Transactional 默认方式 Propagation.REQUIRED
Springboot 跟着我了解下 事务 @Transactional 默认方式 Propagation.REQUIRED
504 0
Springboot 跟着我了解下 事务 @Transactional 默认方式 Propagation.REQUIRED
|
存储 关系型数据库 MySQL
SpringBoot 系列教程之事务不生效的几种 case
前面几篇博文介绍了声明式事务@Transactional的使用姿势,只知道正确的使用姿势可能还不够,还得知道什么场景下不生效,避免采坑。本文将主要介绍让事务不生效的几种 case
246 0
SpringBoot 系列教程之事务不生效的几种 case
|
存储 Java 关系型数据库
SpringBoot系列教程之事务传递属性
对于mysql而言,关于事务的主要知识点可能几种在隔离级别上;在Spring体系中,使用事务的时候,还有一个知识点事务的传递属性同样重要,本文将主要介绍7中传递属性的使用场景
140 0
SpringBoot系列教程之事务传递属性