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

属性值:

相关推荐
石山代码8 小时前
ArrayList / HashMap / ConcurrentHashMap
java·开发语言
AskHarries10 小时前
系统提示词、开发者指令和用户输入的优先级
java·前端·数据库
Moment10 小时前
长上下文会最终杀死 Rag 吗?
前端·javascript·后端
daidaidaiyu10 小时前
ThingsBoard 规则链系统源码分析和自定义定时器
java
蝎子莱莱爱打怪11 小时前
🚀 🚀🚀2026年5月GitHub月榜精选:17个项目中挑出10个推荐,实操4个!
人工智能·后端·ai编程
小毛驴85011 小时前
spring-boot-maven-plugin,maven-compiler-plugin 功能对比
java·python·maven
csdn_aspnet11 小时前
Java 霍尔分区算法(Hoare‘s Partition Algorithm)
java·开发语言·算法
霸道流氓气质11 小时前
通义灵码 IDEA 插件完全使用指南
java·ide·intellij-idea
诸葛务农11 小时前
道路行驶条件下电动汽车永磁电机的有效使用寿命及永磁体的失效和回收再利用(下)
java·开发语言·算法
Percep_gan11 小时前
Java8中的stream的测试使用
java