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事务机制
相关推荐
云-缩影4 分钟前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
ss27320 分钟前
为什么PostgreSQL适合AI场景?
数据库·人工智能·postgresql
瑞克-桑切斯25 分钟前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
z06.1 小时前
MySQL索引
数据库·mysql
考虑考虑1 小时前
Posrgresql恢复.backup文件
数据库·后端·postgresql
云祺vinchin2 小时前
中小企业备份软件选型从恢复需求到总体成本评估
数据库·数据备份·中小企业备份·容灾备份软件
Zenova EdgeOS2 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
KKKlucifer2 小时前
国内数据安全服务的产品智能化转型:大模型赋能下的技术能力重构分析
大数据·数据库·重构
字节跳动开源3 小时前
OpenViking 上线原生 3D 内容理解模型
数据库·开源
Flynn Liang4 小时前
AI 应用的安全红线:Spring AI 下的 Prompt 注入防护、PII 脱敏、输出审计与密钥管理
人工智能·安全·spring·数据泄露·springai·prompt注入