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事务机制
相关推荐
省钱兄--zs11 分钟前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲29 分钟前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog37 分钟前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户212968352616843 分钟前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm
花间相见1 小时前
【计算基础|MySQL01】【上手】安装连接、数据类型与建库建表
数据库·后端
花间相见1 小时前
【计算基础|MySQL02】【上手】SQL 增删改查
数据库·后端
helmsail1 小时前
05 管理活动与选品
java
ITxiaobing20231 小时前
IP 库与 AppsFlyer 国家/地区数据不一致,如何系统地对账?
数据库·网络协议·tcp/ip
天远数科1 小时前
Java数据工程:利用天远人车核验加强版优化智慧高速ETC发行合规体验
java·人工智能
.Bryce.1 小时前
在智能体中使用A2A工具:让大模型自己决定“该找谁帮忙“
android·java·服务器·redis·后端·agent·a2a