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

【代码管理】在本地使用github和gitee之后,可能存在冲突,导致再次提交代码时提示Couldn‘t connect to server

【代码管理】在本地使用github和gitee之后,可能存在冲突,导致再次提交代码时提示Couldn‘t connect to server

大家好,我是全栈小5,欢迎来到《小5讲堂》。 这是《源代码管理工具》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 * 前言 * 错误提示 * 解决方案 * 方案1:临时关闭 Git 的代理设置(推荐先尝试) * 方案2:检查并启动代理服务 * 方案3:直接使用命令行取消代理后克隆 * 方案4:检查环境变量 * 针对 Windows 系统的具体操作 * 方法1:使用 Git Bash 或命令提示符 * 方法2:检查全局 Git 配置 * 验证解决方案 * 如果您确实需要代理 * 为什么会冲突 * 1. 代理配置冲突 * 问题原因: * 典型症状: * 2. 认证信息冲突 * SSH 密钥冲突:

By Ne0inhk
AtomGit 首发!双模型 PK 赛:我用 GLM-5 和 Qwen3.5 一句话生成游戏,谁更强?

AtomGit 首发!双模型 PK 赛:我用 GLM-5 和 Qwen3.5 一句话生成游戏,谁更强?

活动入口:AtomGit 首发模型体验活动 一、项目背景 春节期间,AtomGit AI 社区首发上线了多款开源大模型,包括 GLM-5、Qwen3.5、DeepSeek 等,覆盖文本生成、代码开发、多模态等多个领域。 作为一个喜欢折腾的开发者,我萌生了一个想法:能不能用 AI 双模型并行生成游戏,让用户对比投票选择最佳版本? 这个想法的核心价值: * 横向对比:两个模型同台竞技,优劣一目了然 * 效率翻倍:一次请求,获得两个版本的代码 * 用户参与:投票机制增加趣味性和互动性 二、用 GLM-5 生成项目原型 我直接在 AtomGit 平台上问 GLM-5,让它帮我搭个项目骨架: 我的提问: 请生成一个完整的"一句话生成游戏对比工具"项目代码。 前端Vue3,后端Fastify。

By Ne0inhk

Qwen3-8B vs 其他8B模型:开源大模型性能对比实测

Qwen3-8B vs 其他8B模型:开源大模型性能对比实测 在当前大语言模型“军备竞赛”愈演愈烈的背景下,千亿参数模型固然引人注目,但真正决定AI技术能否落地千行百业的,往往是那些能在普通硬件上跑得动、用得起、管得住的轻量级选手。当A100集群不再是入场券,8B级别的模型正悄然成为开发者手中的“主力战力”。 这其中,阿里通义千问最新发布的 Qwen3-8B 引起了不小关注——它不仅宣称在多项基准测试中超越同级对手,更以对中文场景的深度优化和长达32K的上下文支持,试图在Llama3-8B、Gemma-7B、Mistral-7B等国际主流模型中杀出一条差异化路径。 那么,这款被寄予厚望的国产8B模型,到底强在哪里?我们不妨抛开宣传口径,从技术细节到实际部署,做一次穿透式的分析。 为什么是8B?一个被低估的“黄金平衡点” 很多人认为,大模型越大越好。但现实很骨感:70B模型即使用量化技术,在消费级显卡上也步履维艰;而小至1B~3B的模型又难以胜任复杂推理任务。8B参数规模恰好落在一个微妙的“甜区”—— * 它有足够的容量学习复杂的语言模式和常识知识; * FP16精度下

By Ne0inhk

idea中使用git

Git常用记录 * 一、Git基本配置 * 1.1 Git设置用户账号密码邮箱 * 1.2 Git生成秘钥 * 二、IDEA中使用Git * 1、配置idea * 2、克隆远程仓库 * 3、拉取代码、提交代码到本机仓库 * 4 、git项目回滚,回退版本 * 5、创建分支、合并分支 原文链接: IDEA 使用Git图文详解 一、Git基本配置 1.1 Git设置用户账号密码邮箱 查看信息: 查看用户名 :git config user.name 查看密码: git config user.password 查看邮箱:git config user.email 设置信息(–global

By Ne0inhk