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

Spring Boot 整合完Mybatis,有个特别重要的功能之前忘记讲了:那就是Spring Boot如何实现事物控制。在我们的实际系统中,事务会被经常用到。特别是数据库操作或者是复杂的业务操作时,必须事物执行。必须保证本次业务的处理结果更改要么都成功,要么都失败。那么这种场景下,我们改如何实现呢?
一、为什么要事务
以转账业务为例:一次转载业务涉及数据库表的两次更改。为确保业务完整性,需保证这两次更改要么都成功,要么都失败。否则账户金额就做了,后果非常严重。
image
二、事务播行为
Propagation.REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务,最常见的选择。
Propagation.SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行
Propagation.MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。
Propagation.REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起, 两个事务之间没有关系,一个异常,一个提交,不会同时回滚。
Propagation.NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
Propagation.NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常

三、Spring Boot实现事务
1、首先创建Spring Boot项目,并整合Mybatis相关的依赖。
2、在需要事务的方法上添加 @Transactional注解,并通过propagation指定事务机制。
修改StudentServiceImpl 类和StudentService类,增加 saveUserTransactional 方法。

int saveUserTransactional(Student student);
//开启事务
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public int saveUserTransactional(Student student) {
        studentMapper.insert(student);
        int a = 1 / 0;
        return 1;
    }

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

 @GetMapping("/saveUserTransactional")
    public ResponseResult<Integer>saveUserTransactional(){
        Student student=new Student();
        student.setStuName("张三");
        student.setStuNumber("123");
        student.setStuOperation(1);
        student.setStuGender("男");
        student.setStuAddress("西安");
        return ResponseResult.success(iStudentService.saveUserTransactional(student));
    }

image
四、验证测试
首先我们看目前的sql数据中的数据,Student表中数据如下:
image
在浏览器中输入http://localhost:9090/student/saveUserTransactional执行
image
执行之后
image
可以看到,保存用户数据时,发生异常后,数据库中的数据也没有变化,说明数据已经回滚了。

我们去掉这个在执行:
image
image
image

posted @ 2025-01-06 17:04  lipu123  阅读(68)  评论(0)    收藏  举报