Spring 事务(Transaction)

这一块是 数据库一致性 + AOP实际应用的核心场景


一、先给结论(事务本质)

❗ Spring 事务 = 通过 AOP + 数据库事务能力,实现"要么全部成功,要么全部失败"


二、现实问题(为什么需要事务)

假设你做下单逻辑:1. 扣库存、2. 创建订单、3. 扣余额

❌ 没有事务的问题

执行到一半:

复制代码
1. 扣库存 ✔
2. 创建订单 ✔
3. 扣余额 ❌(失败)

结果:

  • 库存没了

  • 订单存在

  • 钱没扣

👉 数据不一致


三、事务解决方案

Spring 事务保证:

❗ 要么全部成功,要么全部回滚


四、@Transactional 是什么?

❗ 给这个方法加了一个AOP 事务拦截器

java 复制代码
@Transactional
public void createOrder() {
    orderMapper.insert();
    stockMapper.decrease();
    payMapper.pay();
}

五、事务执行全过程(核心链路)

当你调用方法时:

java 复制代码
Controller → Service.createOrder()

实际流程:

复制代码
AOP代理拦截
   ↓
开启事务(Connection.setAutoCommit(false))
   ↓
执行方法
   ↓
成功 → commit
失败 → rollback

六、事务本质(非常重要)

Spring 事务本质是:

❗ 对 JDBC Connection 的封装


JDBC原始写法:

java 复制代码
conn.setAutoCommit(false);

try {
    // SQL1
    // SQL2
    conn.commit();
} catch (Exception e) {
    conn.rollback();
}

Spring写法:

java 复制代码
@Transactional
public void method() {}

👉 Spring帮你做了上面所有事


七、为什么事务依赖 AOP?

因为:

事务必须在"方法执行前后"插入逻辑


AOP结构:

复制代码
@Before → 开启事务
@AfterReturning → 提交事务
@AfterThrowing → 回滚事务

八、事务的执行时机(关键)

复制代码
方法开始 → 开启事务
方法正常结束 → commit
方法抛异常 → rollback

九、默认回滚规则(重要)

Spring 默认:

❗ 只有 RuntimeException才回滚

  • RuntimeException = 编程错误

  • Exception = 业务可控异常


示例:

✔ 会回滚

复制代码
throw new RuntimeException();

❌ 不回滚

复制代码
throw new Exception();

十、所有异常回滚------rollbackFor(企业常用)

java 复制代码
@Transactional(rollbackFor = Exception.class)

意思:

所有异常都回滚


十一、事务失效的经典坑(重点)


❌ 1. 方法内部调用(最常见)

复制代码
public void a() {
    b(); // ❌ 事务失效
}

@Transactional
public void b() {}

原因:

没走代理对象


❌ 2. private 方法

复制代码
@Transactional
private void method() {}

Spring 无法代理


❌ 3. 同类调用

复制代码
this.method();

绕过 AOP


十二、事务传播机制(进阶核心)


常见传播行为:

1️⃣ REQUIRED(默认)有事务就加入,没有就新建


2️⃣ REQUIRES_NEW 强制开启新事务


3️⃣ SUPPORTS 有就用,没有就不用


十三、结合你 minishop 项目

以后你的订单逻辑:

java 复制代码
@Transactional
public void createOrder() {

    stockService.decrease();   // 扣库存
    orderService.create();     // 创建订单
    payService.pay();         // 扣款
}

发生异常:

复制代码
payService.pay()失败

👉 整个方法:

复制代码
自动回滚(库存恢复,订单删除)

十四、事务 + AOP + IOC 三者关系(核心)

复制代码
IOC:负责创建对象
AOP:负责增强行为
Transaction:AOP的一个具体应用

十五、面试级总结

复制代码
Spring事务本质是基于AOP的声明式事务管理,
通过拦截方法,在执行前开启事务,
执行成功提交,异常时回滚,
底层依赖JDBC的Connection事务机制
相关推荐
CCYe、18 小时前
新模型上线、旧模型下线:企业AI网关如何管住模型版本
java·网络·数据库·人工智能
风筝在晴天搁浅18 小时前
解题代码清爽版
java·开发语言
NeverFear79218 小时前
【黑马点评】短信登录
java·redis·tomcat·intellij-idea
疯狂打码的少年18 小时前
【数据库技术】SQL嵌套查询(IN/EXISTS/ANY/ALL)
数据库·笔记·sql
清晨00118 小时前
国产化数据库替代方案:openGauss 详解与 MySQL 平滑迁移实战
数据库·mysql
λqaq718 小时前
MongoDB数据库基础 :非关系型数据库入门与常用操作
数据库·学习·mongodb·nosql
2601_9622986718 小时前
正则表达式引擎 哪些
java·python·perl·pcre·正则表达式引擎
孙克旭_18 小时前
JVM 入门详解:JVM、JRE、JDK 区别,JVM 基础结构梳理
java·开发语言·jvm
随遇而安zx18 小时前
【地基篇】---JVM 内存结构知识点(Java 8 运行时数据区深度解析)
java·开发语言·jvm
布吉岛的石头18 小时前
Java 程序员第 48 阶段1:Transformer 架构总览与自注意力直觉,从 RNN 痛点理解注意力机制
java·架构·transformer