news 2026/6/10 17:41:34

spring-事务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
spring-事务

一.事务简介(以银行账户转账为例)

1.案例简述

在本案例中,我们使用了 Spring 事务管理来确保银行账户的转账操作在出现问题时能够正确回滚,保持数据的一致性。(转账操作要么双方都成功,要么都失败,不能单独成功或者失败)以下是该示例的详细分析,涉及事务的配置、使用、异常处理及其工作流程。

2.代码分析及效果展示

(1)Spring 配置类SpringConfig

  • @Configuration:这是一个配置类,表示该类是 Spring 的配置文件。

  • @ComponentScan("com.itheima"):自动扫描指定包下的所有类,并将带有注解的类注册为 Spring Bean。

  • @PropertySource("classpath:jdbc.properties"):加载数据库配置文件,连接数据库时使用。

  • @Import({JdbcConfig.class, MybatisConfig.class}):导入其他配置类,比如数据库连接池配置和 MyBatis 配置。

  • @EnableTransactionManagement:启用 Spring 的注解式事务管理,允许通过@Transactional来管理事务。

(2)数据访问层AccountDao

  • @Update:这是 MyBatis 提供的注解,用于定义更新 SQL 语句。inMoney用于将指定金额转入账户,outMoney用于将指定金额从账户中扣除。

  • @Param:指定方法参数的名称,以便在 SQL 语句中引用。

(3)实体类Account

  • Account实体类表示银行账户,包含idnamemoney字段。

  • 该类实现了Serializable接口,以便可以在不同的系统中传输数据。

(4)服务层接口AccountService

@Transactional:该注解用于标记方法需要参与事务管理。Spring 会在该方法执行时开启事务,在方法执行完毕后提交事务,若方法抛出异常则回滚事务。

(5)服务层实现类AccountServiceImpl

  • transfer方法:执行银行账户的转账操作。首先从转出方账户中扣款,然后将款项存入转入方账户。

  • 模拟异常:为了演示事务回滚,我们在扣款后强制抛出ArithmeticException异常,导致转账操作失败,整个事务应该会回滚,保持数据一致性。

(6)单元测试类AccountServiceTest

testTransfer:该测试方法调用了AccountServicetransfer方法,执行转账操作。由于transfer方法中的异常,事务会回滚,确保数据不被改变。

(7)结果(数据库)

这是之前没有加异常:

异常加入:

再来一次操作:

3.事务的工作流程

  • 事务开启:当transfer方法被调用时,Spring 会开启一个新的事务。

  • 执行业务操作:首先调用outMoney扣除转出方账户中的金额,然后调用inMoney存入转入方账户。

  • 异常发生:在transfer方法执行过程中,故意抛出了ArithmeticException异常,导致事务回滚。

  • 事务回滚:由于事务的传播特性,整个transfer方法的操作会被回滚,即转账的扣款操作outMoney和存款操作inMoney都不会提交到数据库中,确保数据一致性。

4.总结

  • 事务管理:通过@Transactional注解,Spring 管理方法的事务。在方法执行时,Spring 会自动开启事务,方法执行成功后提交事务,若发生异常则回滚事务。

  • 数据一致性:即使在转账过程中发生异常,也能通过事务回滚机制,确保数据库中的数据保持一致性。

二.Spring事务角色

1.事务管理员 (Transaction Manager)

事务管理员(发起事务方,在Spring中通常指代业务层开启事务的方法)是 Spring 中负责事务管理的核心角色。它是 Spring 框架在执行事务时的幕后操控者,负责事务的具体操作。事务管理员的作用是控制事务的开启、提交和回滚@Transactional注解实际上就标记了哪些方法需要参与事务,事务管理员会基于此开始事务、提交或回滚事务。

2.事务协调员 (Transaction Coordinator)

事务协调员(加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法)负责组织和协调多个事务的执行,它确保事务的正确性和一致性。事务协调员一般会配合事务管理员一起工作,以保证事务的 ACID 特性(原子性、一致性、隔离性、持久性)。

三.Spring事务属性

1.事务配置

我们点进(先ctrl+鼠标左键再ctrl+F12)事务注解,可以看到里面的属性,我们重点介绍rollbackFor()

之前的数据库数据:

实现类:

测试程序:

结果是控制台抛出异常,然后数据库没有改变:

如果我们在实现类这边将原有的错误改为抛出异常:

那么控制台确实会抛出异常,但是数据库改变了:

这种情况是我们不愿意看到的,rollback会回滚两种异常(运行时异常(RuntimeException)和Error),如果我们要回滚刚才的异常,需要使用这个属性rollbackFor:

我们现在重新操作,想要得到的数据是800,1100,确实如此:

2.案例:转账业务追加日志

需求:实现任意两个账户间转账操作,并对每次转账操作在数据库进行留痕操作,不管转账是否成功,均进行转账操作的日志留痕。我们先将数据库恢复至,Tom1000 Jerry1000。

测试代码:

日志实现类:

账户实现类:

数据库日志表和数据表:

如果我们让他出点问题,我们再观察两个表,发现转账失败,日志记录也失败,原因在于日志的记录和转账操作隶属于同一个事务,同成功同失败:transfer方法开启事务之后,出现三个事务加入到事务T中,所以一起成功,一起失败,那我们如何解决呢?

我们单独个日志开启一个单独的事务T2,这里就到了第三部分,事务的传播行为。

3.事务传播行为

对应的属性是propagation,设置事务属性,传播行为设置为当前操作需要新事务

数据库中的数据,数据没有改变,但是日志信息记录了:

总结:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/5 0:39:41

计算机Java毕设实战-基于微服务教材征订系统基于SpringBoot+vue的教材管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/6 11:23:09

别让观望耽误商机:CES Asia 2026参展企业复盘显示提前布局回报率达300%

2025年12月25日消息,当多数企业还在犹豫观望时,往届参展商的实战数据早已给出明确答案:提前布局CES Asia的企业,平均投资回报率高达300%。从自动驾驶公司的亿元级合作到初创企业的超额融资,从现象级媒体曝光到渠道网络…

作者头像 李华
网站建设 2026/6/9 16:30:11

第P3周:Pytorch实现天气识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 目录 一、 前期准备 1. 设置GPU 2. 导入数据 3. 显示图片 4. 划分数据集 二、构建简单的CNN网络 三、 训练模型 1. 设置超参数 2. 编写训练函数 3. …

作者头像 李华
网站建设 2026/5/30 21:24:29

学术圈公认最好用的十大降ai率产品全测评

家人们,现在学校查得是真严,不仅重复率,还得降ai率,学校规定必须得20%以下... 折腾了半个月,终于把市面上各类方法试了个遍,坑踩了不少,智商税也交了。今天这就把这份十大降AI工具合集掏心窝子…

作者头像 李华
网站建设 2026/6/7 4:48:06

企业数据API对接稳定性挑战与高可用架构实践指南

在数字化转型浪潮席卷全球的今天,企业数据API(Application Programming Interface)已成为连接内部系统、第三方服务与合作伙伴生态的核心纽带。然而,随着API调用量的指数级增长,企业面临着严峻的技术挑战:A…

作者头像 李华
网站建设 2026/6/9 18:52:37

通信协议仿真:5G NR协议仿真_(12).5G NR仿真中的移动性管理

5G NR仿真中的移动性管理 1. 移动性管理概述 移动性管理是5G NR(New Radio)协议中的一个重要组成部分,它确保用户在移动过程中能够保持无缝的连接和服务质量。移动性管理涉及多个方面,包括小区选择与重选、切换、重定向、连接恢复…

作者头像 李华