【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属性。

属性值:

相关推荐
谢亮_vipxieliang4 小时前
Spring Cloud 服务治理入门:注册发现、配置中心、网关限流、熔断降级与分布式一致性方案
分布式·spring·spring cloud
Wang's Blog4 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
卷无止境5 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
\光辉岁月/6 小时前
5.java-数组
java·开发语言
谢亮_vipxieliang6 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
狼爷6 小时前
从零用 Java 构建 AI Agent 框架:JavaManus 设计与实现深度解析
后端·langchain·aigc
郑州光合科技余经理6 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_962071576 小时前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm
code2cat6 小时前
Java进阶篇之AtomicReference:一次替换引用,读到一份完整状态
java·并发编程·不可变对象·atomicreference
专业程序开发源6 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计