当前位置: 首页 > news >正文

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,设置事务属性,传播行为设置为当前操作需要新事务

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

总结:

http://www.jsqmd.com/news/145264/

相关文章:

  • 【课程设计/毕业设计】基于Springboot的特产销售平台设计与实现基于springboot的某零售商经营平台的设计与实现【附源码、数据库、万字文档】
  • 【毕业设计】基于微服务教材征订系统(源码+文档+远程调试,全bao定制等)
  • 基于GA-WNN的电涡流传感器温度补偿附Matlab代码
  • 华为批量下发配置命令使用telnetlib模块
  • 手足口病主要病原体:肠道病毒EV71结构与重组蛋白研究全解析
  • vivo X300 Pro:长焦封神但也有小遗憾
  • 写论文像 “拼乐高”?paperzz 毕业论文功能,把学术创作拆成 “简单题”
  • Python 爬虫实战:某高校场馆预约系统的 ASP.NET 动态状态流逆向分析
  • 副业党 / 创业者必看!玫瑰克隆行骗,鲁大魔 AI 软件纯骗人,守住血汗钱
  • 线下挑儿童羽绒服不踩坑!2025年口碑品牌实测指南(宝妈必收) - 品牌测评鉴赏家
  • noob12 反向输出一个四位数
  • 我读了OpenAI的GPT‑5.2提示指南,这样你就不用读了
  • 毕业季 “论文加速器”:paperzz 毕业论文功能,让学术创作少走弯路
  • 计算机Java毕设实战-基于springboot的居民小区物业管理系统的设计与实现基于SpringBoot的智慧物业服务系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 乐享云 v1.1.0| 不限速磁力下载,边下边播,内置字幕匹配
  • 重庆理工大学(CQUT)物理实验一RLC串联谐振
  • hot100-53搜索旋转排序数组
  • “AI写的?我发誓是自己想的!”——Paperzz降重/降AIGC功能,给你的论文穿上“人类思维”伪装衣
  • MBA必看!9个高效降aigc工具推荐,轻松应对AI检测
  • Java计算机毕设之基于SpringBoot+微服务教材征订系统基于SpringBoot的高校教材征订管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 完整教程:Ubuntu学习笔记-部署私有化Gitea服务器、Nginx反向代理
  • 英语_阅读_tanker trucks for carrying edible oil_待读
  • Linux下安装Nginx服务及systemctl方式管理nginx详情 - 指南
  • 2025年儿童羽绒服选购指南:从保暖到时尚,全方位呵护萌娃冬日 - 品牌测评鉴赏家
  • 安卓Framework 层详解
  • 论文「双降难题」破局:从重复率到 AIGC 疑似度,paperzz 降重 / 降 AIGC 功能一次搞定
  • 为GIT仓库项目设置独立配置参数
  • 学术圈公认最好用的十大降ai率产品全测评
  • python 数字类型和字符串类型的相互转换
  • 计算机Java毕设实战-基于微服务教材征订系统基于SpringBoot+vue的教材管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】