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

笔记-数据库事务和java事务和切面

1. 先分三个层级,从上到下

第一层:数据库本身的事务(MySQL 事务)

这是底层原生的,和 Java、Spring 一毛钱关系都没有。MySQL 自己就有事务:begin;→ 开启insert/update/delete``commit;→ 提交rollback;→ 回滚

特点:

  1. 数据库自己管提交、回滚
  2. 开启事务后,不提交、不回滚,连接就一直被占用
  3. 持有行锁、表锁
  4. 一条 SQL 执行完默认自动提交(autocommit=on)

你可以理解为:仓库本身自带的锁机制


第二层:Java 程序里的事务

Java 只是调用数据库,Java 本身没有事务!Java 只是通过 JDBC 告诉 MySQL:

  • 你给我开事务
  • 执行 SQL
  • 最后统一提交 / 统一回滚

JDBC 事务本质就是:控制数据库事务的开关

// JDBC原生伪代码connection.setAutoCommit(false);// 关闭自动提交 = 开启事务// 执行一堆sqlconnection.commit();// 全部成功才提交connection.rollback();// 任意失败全部回滚

所以:Java 没有事务,Java 只是操控数据库事务


第三层:Spring AOP 切面事务(@Transactional)

这就是你天天用的,也是最绕的一层。

Spring 做了一件事:用 AOP 动态代理 + 切面,自动帮你管理 JDBC 事务

流程是:

  1. 你在方法上加@Transactional
  2. Spring 的事务切面拦截这个方法
  3. 方法执行前:自动开启数据库事务(关闭 autoCommit)
  4. 执行你写的业务代码(循环、mapper、接口调用)
  5. 方法全部正常结束:自动 commit 提交
  6. 方法抛异常:自动 rollback 回滚
一句话总结

@Transactional 就是 Spring AOP 切面切面 = 拦截器自动帮你开关数据库事务。


2. 三者完整关系链(核心图)

Spring AOP事务切面 ↓ 控制 Java JDBC 事务 ↓ 操控 MySQL 数据库原生事务
  1. 数据库事务:底层能力
  2. Java JDBC:中间桥梁,发指令给数据库
  3. Spring AOP 切面:自动帮你套事务,不用手写开关

2.1 @Transactional 的传播行为
传播行为含义核心一句话
REQUIRED(默认)如果外层有事务,就加入当前事务;没有则新建事务有就共用,没有就新建
SUPPORTS外层有事务,就加入;没有事务,就无事务执行有就用,没有就裸跑
MANDATORY外层必须存在事务,没有直接抛异常必须外层有事务,否则报错
REQUIRES_NEW挂起外层事务,创建全新独立事务;内外事务互不影响挂起旧的,开全新事务
NOT_SUPPORTED挂起外层事务,以无事务运行;执行完恢复外层事务挂起旧事务,强制裸跑
NEVER绝对不允许外层存在事务;外层有事务直接抛出异常有事务直接报错
NESTED外层有事务,则在当前事务内创建保存点 (savepoint);外层无事务则新建事务嵌套事务,支持局部回滚

3. 问题回答

问题 1:Java 有事务吗?

**没有。**Java 只是操控数据库事务。

问题 2:@Transactional 是什么?

Spring AOP 切面。专门用来自动管理数据库事务的切面。

问题 3:切面和事务是什么关系?

切面 = 事务的管理者不加注解 → 切面不理你加默认注解 → 切面全程托管事务加NOT_SUPPORTED→ 切面完全不管,放开你

问题 4:为什么定时任务一定要 NOT_SUPPORTED?

定时任务特点:

  • 长循环
  • 大量数据库操作
  • 调用外部接口、流程引擎(慢 IO)
  • 不需要多 SQL 统一回滚

完全不需要统一事务,所以直接关掉切面托管。

问题 5:程序运行数据库是不是会停止?

**完全不是!**数据库一直正常运行。只是不加注解时:连接被切面开启的长事务占住,别人用不了

问题 6:什么时候需要 @Transactional 默认事务?

普通业务接口比如:下单、扣款、入库、修改多条 SQL 必须一起成功、一起失败,不能中途提交。

问题 7:什么时候必须关掉事务(NOT_SUPPORTED)?
  • 定时任务
  • 异步任务
  • 后台批处理
  • 循环大量操作
  • 方法内包含网络调用、第三方接口
  • 不需要统一回滚的场景

4. 背诵口诀

  1. 事务本身是数据库的,Java 没有事务
  2. @Transactional 是 Spring AOP 切面,自动管数据库事务
  3. 默认切面:方法全程一个大事务,跑完才提交
  4. NOT_SUPPORTED:取消切面管理,无事务,每条 SQL 自动提交
  5. 定时任务必须关闭切面
http://www.jsqmd.com/news/1374591/

相关文章:

  • 提升GIF质量的秘密武器:awesome-gif精选优化工具与脚本
  • TCP 与 UDP:传输层的 “靠谱老大哥” 与 “闪电跑腿员”
  • 指挥中心AI数据大屏生成工具选型|政务公安应急场景推荐
  • Codex 写 Commit,你敢全自动?
  • Letmeask核心功能解析:实时问答、点赞与高亮机制全揭秘
  • 2026 年更新:君山有实力的复合材料井盖厂商哪家强,老小区换它花了500?难怪邻居家2年没坏过-万化复合材料 - 行业推荐官[官方】--
  • 2026年8月淘金设备源头厂家排名:哪家好?
  • xone驱动完全解析:从安装到配置的快速入门教程
  • 需求评审后我才明白,Demo能跑和能上线差了几个量级
  • 破局!量/检测设备的“中国速度”
  • emacs-format-all-the-code与其他格式化工具对比:为什么它是Emacs中的最佳选择
  • AACE2026北京算力展官方预定!成交30亿领跑行业
  • g2core与Marlin兼容性指南:3D打印固件无缝切换教程
  • 基于LangGraph与GPT-4构建多智能体对话系统:从原理到工程实践
  • 从源码到部署:fast_rsync开发者完全手册(含基准测试与Fuzzing实践)
  • add-to-project开发指南:从零开始贡献你的第一个GitHub Action
  • 开源项目吐槽大会:一场技术人的“自黑”与“共情”
  • 2026年GEO选型横评:五大技术维度看清工具底色
  • 物流行业财务共享服务效能智能看板:基于AI Agent与全栈智能自动化的技术架构与主流方案盘点
  • PHP JSON解析详解:从对象属性到数组键值的正确获取与处理
  • CSSG安装与配置终极教程:从环境搭建到依赖解决
  • 思源宋体CN:7种字重免费开源中文字体终极使用指南
  • Morpheus架构解密:深入理解 isomorphic 设计如何提升网页性能与用户体验
  • pi-web远程开发支持:在任何地方访问你的项目
  • 商标设计注册取名有哪些技巧?好名字怎么想出来?
  • 2026 年现阶段,永嘉优秀的酒店整体设备打包回收实体店联系方式,旧酒店关门后,剩下的桌椅空调居然能这样处理? - 行业推荐官-2
  • Outlook Copilot邮件摘要:AI如何重塑邮件处理与工作效率
  • GitHub Linguist完全指南:从安装到高级配置的终极教程
  • LLM应用流量治理实战:基于Token的复合限流架构设计与实现
  • TODO-MVI-RxJava-Kotlin项目源码解析:从Intent到ViewState的完整流程