03.1 事务核心架构
本章覆盖 Spring 事务的三大顶级接口、完整执行流程、声明式 vs 编程式事务对比。理解这些是掌握 Spring 事务管理的基础。
1. 核心架构:三大顶级接口
1.1 PlatformTransactionManager
java
public interface PlatformTransactionManager {
// 根据 TransactionDefinition 获取或创建事务,返回当前事务状态
TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
throws TransactionException;
// 提交事务
void commit(TransactionStatus status) throws TransactionException;
// 回滚事务
void rollback(TransactionStatus status) throws TransactionException;
}1.2 三种核心实现
| 实现类 | 对应场景 | 底层机制 |
|---|---|---|
DataSourceTransactionManager | 单一 JDBC 数据源(MyBatis、JDBC Template) | java.sql.Connection |
JpaTransactionManager | JPA(Hibernate) | EntityManagerFactory + EntityTransaction |
HibernateTransactionManager | 原生 Hibernate(已弃用) | SessionFactory + Transaction |
1.3 TransactionDefinition
java
public interface TransactionDefinition {
// 7 种传播行为
int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;
// 5 种隔离级别
int ISOLATION_DEFAULT = -1; // 使用数据库默认
int ISOLATION_READ_UNCOMMITTED = 1; // 读未提交
int ISOLATION_READ_COMMITTED = 2; // 读已提交
int ISOLATION_REPEATABLE_READ = 4; // 可重复读
int ISOLATION_SERIALIZABLE = 8; // 串行化
int getPropagationBehavior();
int getIsolationLevel();
int getTimeout();
boolean isReadOnly();
@Nullable String getName();
}1.4 TransactionStatus
java
public interface TransactionStatus extends TransactionExecution, SavepointManager, Flushable {
boolean isNewTransaction(); // 是否是新事务(而非参与已有事务)
boolean hasSavepoint(); // 是否有保存点(NESTED 传播行为使用)
void setRollbackOnly(); // 标记为仅回滚
boolean isRollbackOnly(); // 是否被标记回滚
boolean isCompleted(); // 事务是否已完成
void flush(); // 刷新底层会话
}2. PlatformTransactionManager 的完整执行流程
3. 声明式事务 vs 编程式事务 — 底层对比
两种方式最终都调用相同的 PlatformTransactionManager API:
java
// TransactionTemplate 底层源码
public class TransactionTemplate extends DefaultTransactionDefinition
implements TransactionOperations, InitializingBean {
@Nullable
public <T> T execute(TransactionCallback<T> action) throws TransactionException {
// 获取当前事务(与声明式事务完全相同)
TransactionStatus status = this.transactionManager.getTransaction(this);
T result;
try {
// 执行业务回调
result = action.doInTransaction(status);
} catch (RuntimeException | Error ex) {
// 异常回滚
rollbackOnException(status, ex);
throw ex;
} catch (Throwable ex) {
// checked exception 回滚
rollbackOnException(status, ex);
throw new UndeclaredThrowableException(ex,
"TransactionCallback threw undeclared checked exception");
}
// 正常提交
this.transactionManager.commit(status);
return result;
}
}核心面试题
- Spring 声明式事务的底层实现原理?从
@Transactional到数据库commit()的完整调用链? TransactionSynchronizationManager的作用?Spring 如何实现事务的线程隔离?- 编程式事务的
TransactionTemplate.execute()和声明式事务执行路径有何异同?
← 返回 **返回 事务管理索引**