Spring 是如何管理事务的,事务管理机制
Spring 事务管理的核心是 “统一封装不同数据源的事务操作,提供声明式和编程式两种方式”,底层依赖 AOP 实现,机制如下:
# 1. 事务管理的两种方式
- 编程式事务:手动通过
TransactionTemplate或PlatformTransactionManager控制事务,灵活性高,但代码侵入性强。
示例(TransactionTemplate):
@Autowired
private TransactionTemplate transactionTemplate;
public void saveUser(User user) {
transactionTemplate.execute(status -> {
try {
userDAO.insert(user);
return true;
} catch (Exception e) {
status.setRollbackOnly(); // 手动回滚
return false;
}
});
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
- 声明式事务:通过
@Transactional注解实现,无需手动写事务控制代码,底层由 AOP 自动植入事务逻辑(开启、提交、回滚),代码侵入性低,是 Spring 推荐的方式。
示例 :
java 运行
@Service
public class UserService {
@Autowired
private UserDAO userDAO;
@Transactional(rollbackFor = Exception.class) // 声明事务,异常回滚
public void saveUser(User user) {
userDAO.insert(user);
// 若抛出Exception,事务自动回滚
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 2. 核心组件
PlatformTransactionManager:事务管理器接口,是 Spring 事务管理的核心,不同数据源对应不同实现:
DataSourceTransactionManager:用于 JDBC/MyBatis(基于关系型数据库);HibernateTransactionManager:用于 Hibernate;JpaTransactionManager:用于 JPA。作用:提供
getTransaction()1(获取事务)、
commit()1(提交事务)、
rollback()1(回滚事务)方法。
TransactionDefinition:事务定义接口,定义事务的属性:
- 隔离级别(Isolation):如
READ_COMMITTED、REPEATABLE_READ; - 传播行为(Propagation):如
REQUIRED(默认,若有事务则加入,无则新建)、REQUIRES_NEW(新建事务,暂停当前事务); - 超时时间(Timeout):事务超时自动回滚(默认 - 1,无超时);
- 只读属性(ReadOnly):若为 true,事务仅执行查询,数据库可优化性能。
- 隔离级别(Isolation):如
TransactionStatus:事务状态接口,记录事务的当前状态(如是否活跃、是否需要回滚)。
# 3. 声明式事务的实现原理(AOP)
- 1. 切面织入:Spring 扫描带有
@Transactional注解的 Bean,为其生成代理对象(JDK 或 CGLIB),在目标方法执行前后植入事务逻辑。 - 2. 事务执行流程:
- 代理对象调用目标方法前,通过
PlatformTransactionManager.getTransaction()获取事务(根据TransactionDefinition配置),开启事务; - 执行目标方法:若方法正常返回,调用
commit()提交事务; - 若方法抛出异常(且异常类型符合
rollbackFor配置),调用rollback()回滚事务;若异常不符合,则提交事务。
- 代理对象调用目标方法前,通过
- 注意:
@Transactional默认只对RuntimeException和Error回滚,若需对 checked 异常(如IOException)回滚,需显式配置rollbackFor = Exception.class。
上次更新: 12/30/2025