SpringBoot事务
# @Transactional
@Transactional 是 Spring 的事务管理注解,用来声明某个方法或类运行时需要事务支持。
注意事项
- 只能作用在 public 方法(Spring AOP 的限制)。
- 同类方法内部调用事务不会生效(需要代理调用)。
- 默认只回滚运行时异常(RuntimeException),检查型异常要手动指定 rollbackFor。
# @Transactional核心属性
| 属性 | 作用 | 默认值 |
|---|---|---|
isolation | 事务隔离级别(解决并发时数据一致性问题) | 数据库默认 |
propagation | 事务传播行为(方法调用时事务如何传播) | REQUIRED |
rollbackFor | 指定遇到哪些异常回滚 | 运行时异常 |
noRollbackFor | 指定遇到哪些异常不回滚 | 空 |
timeout | 事务超时时间(秒) | -1(不超时) |
readOnly | 是否只读事务(提高查询性能) | false |
rollbackFor和noRollbackFor 异常:
- 运行时异常(unchecked exception【非受检异常】)
- 编译时异常(checked exception【受检异常】)
-【回滚的默认机制】
- 运行时异常:回滚
- 编译时异常:不回滚
rollbackFor【可以指定哪些异常需要回滚】 -【回滚 = 运行时异常(默认) + 指定回滚异常】
noRollbackFor(同 noRollbackForClassName):指明哪些异常不需要回滚。
- 【不回滚 = 编译时异常(默认) + 指定不回滚异常】

# 隔离级别isolation
读未提交(Read Uncommitted)
- 事务可以读取未被提交的数据,易产生脏读、不可重复读和幻读等问题
读已提交(Read Committed)
- 事务只能读取已经提交的数据,可避免脏读,但可能引发不可重复读和幻读。
可重复读(Repeatable Read)
- 同一事务期间多次重复读取的数据相同。避免脏读和不可重复读,但仍有幻读的问题
串行化(Serializable)
- 最高隔离级别,完全禁止了并发,只允许一个事务执行完毕之后才能执行另一个事务
| 级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交 | √ | √ | √ |
| 读已提交 | × | √ | √ |
| 可重复读 | × | × | √ |
| 串行化 | × | × | × |
# 传播行为propagation
定义:当一个事务方法被另一个事务方法调用时,事务该以何种状态存在?事务属性该如何传播下去?
| 传播行为 | 说明 |
|---|---|
REQUIRED | 支持当前事务,当前有事务就加入,没有就新建一个(默认值) |
REQUIRES_NEW | 支持当前事务,总是新建事务,挂起原来的 |
SUPPORTS | 支持当前事务,有事务就加入,没有就不用事务 |
NOT_SUPPORTED | 非事务执行,不支持事务,如果存在当前事务则挂起原来的 |
NEVER | 非事务执行,不支持事务,如果存在当前事务则报错 |
MANDATORY | 支持当前事务,如果不存在则抛出异常 |
NESTED | 支持当前事务,如果当前存在事务,则在嵌套事务中执行,否则像 REQUIRED 一样运行 |
说明 当前事务指的的是父方法的事务
Last Updated: 2025/10/22, 08:25:28