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

[SSM]Spring事务

Spring事务

事务作用: 在数据层保障一系列的数据库操作同成功同失败

Spring事务作用: 在数据层或业务层保障一系列的数据库操作同成功同失败

  1. Spring事务依赖 PlatformTransactionManager 接口
  2. DataSourceTransactionManager对象 是 PlatformTransactionManager的具体实现

入门案例

模拟银行账户间转账业务

需求: 实现任意两个账户间转账操作需求

微缩: A账户减钱,B账户加钱

分析

  1. 数据层提供基础操作,指定账户减钱(outMoney),指定账户加钱(inMoney )
  2. 业务层提供转账操作(transfer),调用减钱与加钱的操作
  3. 提供2个账号和操作金额执行转账操作
  4. 基于Spring整合MyBatis环境搭建上述操作

问题分析

  1. 程序正常执行时,账户金额A减B加,没有问题
  2. 程序出现异常后,转账失败,但是异常之前操作成功, 异常之后操作失败,整体业务出现问题

通过Spring事务管理解决问题

  1. 在业务层接口上添加Spring事务管理

  • Spring注解式事务通常添加在业务层接口中而不会添加到业务层实现类中,降低耦合
  • 注解式事务可以添加到业务方法上表示当前方法开启事务,也可以添加到接口上表示当前接口所有方法开启事务
  1. 设置事务管理器

  • 事务管理器要根据实现技术进行选择
  • MyBatis框架使用的是JDBC事务
  1. 开启注解式事务驱动

事务角色

理解Spring处理事务的原理

  1. 没有开启Spring事务, Dao层的事务是独立的, 程序出现异常后, 业务整体就出现了数据不一致的情况

  1. 开启Spring事务后, Dao层的事务会加入Spring事务, 由Spring同一管理, 异常后就能同一回滚, 保持数据一致

  1. 事务角色: Spring事务被称为事务管理管, 其他事务称为事务协调员

  • 事务管理员: 发起事务方,在Spring中通常指代业务层开启事务的方法
  • 事务协调员: 加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法

Spring为什么可以管理数据层的事务?

因为 注册Spring事务管理器 和 创建Mybatis数据连接 使用的是同一个dataSource(数据源对象)

事务配置

Spring的事务可以进行精细化的配置

public interface AccountService { // readOnly默认值是false, 是读写事务 @Transactional(readOnly=true,timeout=-1) public void transfer(String out,String in ,Double money)throws IoException; }
/** rollbackFor: 设置事务的回滚异常 程序中出现异常, 以下两种异常可以触发事务回滚: 1. Error系列, 比如内存溢出 2. 运行时异常, 比如 xxxException 其他的异常类型不会触发事务的回滚 恰巧io exception不属于运行时异常, 所以默认不触发事务 如果需要的话, 就自己配置一下 */ public interface AccountService { @Transactional(rollbackFor = {IOException.class}) public void transfer(String out,String in ,Double money)throws IoException; }

事务传播行为

转账业务追加日志

需求: 实现任意两个账户间转账操作,并对每次转账操作在数据库进行留痕

需求微缩: A账户减钱,B账户加钱,数据库记录日志分析

  1. 基于转账操作案例添加日志模块,实现数据库中记录日志
  2. 业务层转账操作(transfer),调用减钱、加钱与记录日志功能实现
  3. 效果预期
  • 无论转账操作是否成功,均进行转账操作的日志留痕
  1. 存在的问题
  • 日志的记录与转账操作隶属同一个事务,同成功同失败

  1. 实现效果预期改进
  • 无论转账操作是否成功,日志必须保留

事务传播行为: 事务协调员对事务管理员所携带事务的处理态度

  1. 在业务层接口上添加Spring事务,设置事务传播行为REQUIRES_NEW (需要新事务)

  1. 其他的可选值

http://www.cnnetsun.cn/news/180025.html

相关文章:

  • LangFlow镜像邮件自动回复:集成SMTP发送个性化信件
  • springboot基于Spark在线广告推荐系统数据分析可视化大屏_d6of80kj_038
  • 【保姆级实战】Teacher-Student知识蒸馏,从入门到精通,把大模型“传功”给小模型,收藏这篇就够了!
  • springboot基于人脸识别的微信小程序的学生选课签到定位考勤系统_alo61m05
  • 大模型微调终极指南!全参数、LoRA、QLoRA的原理与区别,一篇彻底讲透
  • 全力支持华为生态,易连EDI–EasyLink 率先支持华为欧拉操作系统(EulerOS)
  • 20251222_114419_30_个必知的_AI_智能体关键术语
  • 颠覆认知!大模型的“良心”竟然是“喂”出来的?RLHF技术,让AI从“魔鬼”变“天使”!
  • springboot旧时光咖啡厅奶茶店管理系统_5hg9ioru
  • 【Open-AutoGLM旅游攻略生成秘籍】:手把手教你用AI自动生成爆款旅行路线
  • 实证:黄金不等式规则之下,反激电源有多强大?
  • CSH初始晶胞优化细节与模拟准备:细节调整、实验验证及数据转换指南
  • LangFlow镜像DevOps实践:持续交付AI应用的最佳路径
  • LangFlow镜像合规检查器:确保业务符合法律法规要求
  • 【专家级解读】:Open-AutoGLM如何解决多骑手轨迹交叉识别难题
  • 外卖履约率提升60%的秘密武器:Open-AutoGLM智能提醒系统全揭秘
  • (Open-AutoGLM + 本地生活)技术融合白皮书:未来服务调度新范式
  • 敏捷浪潮下的测试团队转型挑战
  • 面向对象和面向过程编程,到底用哪个好?
  • C语言里用switch处理枚举的正确姿势和避坑指南
  • 你还在人工处理外卖评价?Open-AutoGLM已实现AI全自动分级响应(附架构图)
  • Open-AutoGLM实战案例:某区域外卖平台订单吞吐量提升5倍的真实路径
  • 从 0 到 1!AI 大模型保姆级学习路线
  • 可能是最简单的本地化 DeepSeek+个人知识库实现方案
  • SCI论文查AI率,可以用免费系统查吗?
  • 收藏!程序员从零转行大模型:4大核心难点+实操路径全解析
  • STM32HAL库中断教程以及分装中断工具函数(附下载地址)
  • PaperXie文献综述智能生成:3步把“文献堆砌”变“学术脉络”,导师直呼“这才是综述”!
  • 基于STM32的水质PH值电导率TDS超声波水位液位检测系统设计
  • 基于STM32的智能家居控制系统设计与应用