Java外功精要(6)——Spring事务及其传播机制

Java外功精要(6)——Spring事务及其传播机制

1.概述

Spring事务管理是Spring框架中用于确保数据库操作 原子性、一致性、隔离性和持久性(ACID)
的核心机制。它通过声明式编程式(本文略)方式管理事务,支持多种事务传播行为和隔离级别相较于编程式事务,声明式事务通过@Transactional注解实现事务管理,无需手动编写事务代码事务基本概念在全面解析MySQL(5)——“索引、事务、JDBC”三大核心一文中有介绍,本文不再赘述

2.@Transactional

作用:提供声明式事务管理。它简化了在应用程序中管理数据库事务的流程。开发者只需在方法或类上添加此注解,Spring框架就会自动处理事务的开启、提交和回滚,无需手动编写事务管理代码(如 begin、commit、rollback)
级别:类 + 方法作为类注解:为类中所有public方法添加注解作为方法注解:默认仅对public方法生效
@RequestMapping("/test")@RestController@Slf4jpublicclassTestController{privatefinalUserService userService;@AutowiredpublicTestController(UserService userService){this.userService = userService;}@Transactional@RequestMapping("/test1")publicStringtest1(String userName,String password){UserInfo userInfo =newUserInfo(); userInfo.setUserName(userName); userInfo.setPassword(password);Integer result = userService.register(userInfo);if(result ==1){ log.info("test1注册成功,userName:{},password:{}", userName, password);}return"注册成功";}}
使用PostMan向后端发送请求:
MySQL查询结果如下:

后端日志日志如下:

2.1 rollbackfor

作用:指定哪些异常触发回滚,默认情况下在抛出 非受查异常(RuntimeException)/错误(Error) 时触发回滚

指定回滚类型

@RequestMapping("/test")@RestController@Slf4jpublicclassTestController{privatefinalUserService userService;@AutowiredpublicTestController(UserService userService){this.userService = userService;}@Transactional(rollbackFor =Exception.class)@RequestMapping("/test4")publicStringtest4(String userName,String password)throwsIOException{UserInfo userInfo =newUserInfo(); userInfo.setUserName(userName); userInfo.setPassword(password);Integer result = userService.register(userInfo);if(result ==1){ log.info("test4注册成功,userName:{},password:{}", userName, password);thrownewIOException();}return"注册成功";}}
使用PostMan向后端发送请求:
MySQL查询结果如下:

后端日志日志如下:

抛出非受查异常时

@RequestMapping("/test")@RestController@Slf4jpublicclassTestController{privatefinalUserService userService;@AutowiredpublicTestController(UserService userService){this.userService = userService;}@Transactional@RequestMapping("/test3")publicStringtest3(String userName,String password){UserInfo userInfo =newUserInfo(); userInfo.setUserName(userName); userInfo.setPassword(password);Integer result = userService.register(userInfo);if(result ==1){ log.info("test3注册成功,userName:{},password:{}", userName, password);thrownewRuntimeException();}return"注册成功";}}
使用PostMan向后端发送请求:
MySQL查询结果如下:

后端日志日志如下:

抛出受查异常时

@RequestMapping("/test")@RestController@Slf4jpublicclassTestController{privatefinalUserService userService;@AutowiredpublicTestController(UserService userService){this.userService = userService;}@Transactional@RequestMapping("/test2")publicStringtest2(String userName,String password)throwsIOException{UserInfo userInfo =newUserInfo(); userInfo.setUserName(userName); userInfo.setPassword(password);Integer result = userService.register(userInfo);if(result ==1){ log.info("test2注册成功,userName:{},password:{}", userName, password);thrownewIOException();}return"注册成功";}}
使用PostMan向后端发送请求:
MySQL查询结果如下:

后端日志日志如下:

2.2 isolation

作用:用于指定事务的隔离级别Isolation.DEFAULT:使用底层数据库默认的隔离级别Isolation.READ_UNCOMMITTED:读未提交Isolation.READ_COMMITTED:读已提交Isolation.REPEATABLE_READ:可重复读Isolation.SERIALIZABLE:串行化每种隔离级别的具体效果在全面解析MySQL(5)——“索引、事务、JDBC”三大核心一文中有介绍,本文不再赘述

2.3 propagation

作用:用于定义事务的传播行为,即当前事务方法被另一个事务方法调用时,事务应如何传播。Spring提供了7种传播行为,均基于Propagation枚举类实现

2.3.1 Propagation.REQUIRED

默认传播行为。如果当前存在事务,则加入该事务;如果不存在事务,则新建一个事务

2.3.2 Propagation.SUPPORTS

如果当前存在事务,则加入该事务;如果不存在事务,则以非事务方式执行

2.3.3 Propagation.MANDATORY

强制要求当前存在事务并加入,否则抛出异常

2.3.4 Propagation.REQUIRES_NEW

无论当前是否存在事务,都新建一个事务。新事务与当前事务独立,互不干扰

2.3.5 Propagation.NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,则挂起该事务

2.3.6 Propagation.NEVER

强制要求当前不能存在事务,否则抛出异常

2.3.7 Propagation.NESTED

如果当前存在事务,则在嵌套事务中执行;如果不存在事务,则行为与Propagation.REQUIRED相同。嵌套事务的回滚不影响外部事务,但外部事务回滚会导致嵌套事务回滚(适用于需要部分回滚的场景)

3.Gitee

Gitee地址:九转苍翎
本文源码:spring-trans

Read more

Java各大厂实习面试题面经新鲜出炉!---壹

Java各大厂实习面试题面经新鲜出炉!---壹

🌟 Hello,我是Java学习通! 🌈 在彩虹般绚烂的技术栈中,我是那个永不停歇的色彩收集者。 🦋 每一个优化都是我培育的花朵,每一个特性都是我放飞的蝴蝶。 🔬 每一次代码审查都是我的显微镜观察,每一次重构都是我的化学实验。 🎵 在编程的交响乐中,我既是指挥家也是演奏者。让我们一起,在技术的音乐厅里,奏响属于程序员的华美乐章。 目录 1.MySQL事务机制(阿里巴巴) 2.有做过SQL优化的实现么(阿里巴巴) 3.Nacos底层是如何实现注册中心功能的:(阿里巴巴) 4.RocketMQ如何持久化(阿里巴巴) 5.介绍一下websocket(阿里巴巴) 6.如何判断是http是长连接还是短连接,怎么设置长连接(阿里巴巴) 7.HashMap的实现原理(快手) 8.HashMap承载的元素越来越少,什么时候会退化成链表,为什么两者设置的这个值不对称(快手) 9.mysql和redis的一致性怎么保证的(快手) 10.数据库有哪些隔离级别 默认的隔离级别是什么(快手) 11.缓存击穿

By Ne0inhk
【2025 年最新版】Java JDK 安装与环境配置教程(附图文超详细,Windows+macOS 通用)

【2025 年最新版】Java JDK 安装与环境配置教程(附图文超详细,Windows+macOS 通用)

Java 作为后端开发的核心语言,JDK(Java Development Kit)是开发和运行 Java 程序的基础环境。2025 年最新推荐安装JDK 21—— 这是 Java SE 平台的长期支持(LTS)版本,可免费用于生产环境及重新分发,直到 2026 年 9 月仍能享受免费更新服务,后续更新将按 Oracle OTN 许可证管理。本文将针对 Windows(10/11)和 macOS(Intel/M 芯片)两大主流系统,提供从官方下载、分步安装到环境变量配置的完整教程,附带验证步骤和常见问题排查,零基础也能轻松上手! 一、JDK 21 核心优势(为什么选它?) 1. 长期支持更稳定:作为

By Ne0inhk

Ollama + Milvus 本地智能体搭建指南:打造本地部署RAG知识库助手(java快速搭建)

前提需要docker环境 本文基于docker安装 Milvus 向量数据库 后台通过java项目启动  java版本17 技术组件核心作用核心优势 Ollama本地运行开源大模型(对话生成、文本向量化)    1. 轻量便捷,一键部署,无需复杂的模型环境配置;    2. 离线可用,支持 Qwen、Llama、Mistral 等多款开源模型;    3. 支持自定义模型,可嵌入固定角色与业务规则;    4. 无调用额度限制,零成本使用。 Milvus存储与检索高维向量数据(知识库核心载体)    1. 专为向量检索设计,性能远超通用数据库,支持百万级向量快速检索;    2. 支持数据持久化,重启服务后知识库数据不丢失;    3. 提供可视化工具 Attu,方便管理向量集合与数据;    4. 可横向扩展,从单机版平滑升级到分布式集群,满足业务增长需求。 Spring AI基于 Spring Boot,简化大模型 / 向量库整合

By Ne0inhk
Java 时间类(中):JDK8 全新时间 API 详细教程

Java 时间类(中):JDK8 全新时间 API 详细教程

🏠个人主页:黎雁 🎬作者简介:C/C++/JAVA后端开发学习者 ❄️个人专栏:C语言、数据结构(C语言)、EasyX、JAVA、游戏、规划、程序人生 ✨ 从来绝巘须孤往,万里同尘即玉京 文章目录 * Java 时间类(中):JDK8 全新时间 API 详细教程 🕘 * 📝 文章摘要 * 🧠 上篇知识回顾 * 一、JDK8 时间类整体架构 🏛 * 二、ZoneId 时区类 🌍 * 1. 核心作用 * 2. 常用方法 * 3. 代码示例 * 三、Instant 时间戳类 ⚡ * 1. 核心作用 * 2. 常用方法 * 3. 代码示例 * 四、ZonedDateTime

By Ne0inhk