【JavaWeb | 第十篇】Spring中的事务控制

目录

一、什么是事务?

二、Spring事务管理

[2.1 基本事务管理](#2.1 基本事务管理)

[2.2 事务进阶-rollbackFor](#2.2 事务进阶-rollbackFor)

[2.3 事务进阶-propagation](#2.3 事务进阶-propagation)


一、什么是事务?

关于什么是事务,在MySQL篇中的第五篇有详细的介绍。

【MySQL | 第五篇】事务控制https://blog.csdn.net/iting_0924/article/details/160546488?spm=1001.2014.3001.5501

如果没有事务会发生什么?

在我们添加员工信息时,我们需要操作两张数据库表------Emp表和EmpExpr表,并且EmpExpr表中的dept_id是根据Emp表中的id录入的,如果在操作完Emp表之后服务器出现错误,那么后面的员工工作经历信息就无法录入,会出现数据库保存数据不完整、不一致的问题,这显然是不符合业务逻辑的。因此我们需要引入事务,将这两个操作设置为一个事务,整体进行操作。

首先,新增员工的Service层的业务代码实现:

java 复制代码
    @Override
    public void save(Emp emp) {
        //1.保存员工基本信息
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.insert(emp);

        //2.批量保存员工工作经历信息
        List<EmpExpr> exprList = emp.getExprList();
        if(!CollectionUtils.isEmpty(exprList)){
            exprList.forEach(empExpr ->{
                empExpr.setEmpId(emp.getId());
            });
            empExprMapper.insertBatch(exprList);
        }

我们要将这两步操作封装到一个事务当中,保证数据库操作的一致性。Spring提供了事务的封装,Spring事务管理

二、Spring事务管理

2.1 基本事务管理

注解@Transactional

作用:将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务

位置:业务(service)层的方法上、类上、接口上。

注:推荐将该注解添加到业务层指定的方法上。

我们在save方法上添加上**@Transactional**注解:

java 复制代码
    @Transactional
    @Override
    public void save(Emp emp) {
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.insert(emp);

        List<EmpExpr> exprList = emp.getExprList();
        if(!CollectionUtils.isEmpty(exprList)){
            exprList.forEach(empExpr ->{
                empExpr.setEmpId(emp.getId());
            });
            empExprMapper.insertBatch(exprList);
        }

添加注解之后在运行时就会出现,初始化事务的debug信息。如果中间出错,那么事务就会rollback到之前的状态。

2.2 事务进阶-rollbackFor

rollbackFor属性用于控制出现何种异常类型,回滚事务。

例如:

java 复制代码
@Transactional(rollbackFor = {Exception.class})

代表出现所有的异常都要进行事务的回滚。

注意:默认出现运行时异常RuntimeException才会回滚。

2.3 事务进阶-propagation

事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。

例如:方法a和方法b都声明了是一个事务,而且方法a中间还调用了b方法,那么b方法应该加入当前的事务,还是应该再新建一个事务呢?

假如b方法是用来插入数据操作日志信息的,这个b方法无论a方法执行成功与否,b都要执行一次,因此需要给这个方法添加一个propagation = Propagation.REQUIRED属性。

属性值:

相关推荐
SimonKing1 小时前
美团不做外卖做浏览器了,而且是AI浏览器:Tabbit
java·后端·程序员
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第48题】【JVM篇】第8题:JVM 里的有几种 ClassLoader?为什么会有多种?
java·开发语言·jvm·面试
才疏学浅7431 小时前
批量下载鹏程实验室数据的方法
java·开发语言·word
Gopher_HBo1 小时前
Go语言常见并发模式
后端
皮卡祺q1 小时前
【JVM】:类加载机制,jvm内存布局,垃圾回收,String 不可变性源码分析
java·开发语言·jvm·多线程·string
JAVA面经实录9171 小时前
Java核心底层原理全集(终版无遗漏·生产级PDF)
java·开发语言·学习
java修仙传1 小时前
实习日志:完成算法调用总接口并修复联调问题
java·开发语言·数据库
铅笔小新z1 小时前
【Linux】进程间通信(IPC)
java·linux·运维
极客先躯1 小时前
高级java每日一道面试题-2025年12月11日-实战篇[Docker]-如何配置 Docker 的资源限制(CPU、内存、磁盘)?
java·docker·如何配置docker的资源限制·资源限制的底层支柱·linux cgroups·cpu 限制·从逻辑到策略