Skip to content

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
JpaTransactionManagerJPA(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;
    }
}

核心面试题

  1. Spring 声明式事务的底层实现原理?从 @Transactional 到数据库 commit() 的完整调用链?
  2. TransactionSynchronizationManager 的作用?Spring 如何实现事务的线程隔离?
  3. 编程式事务的 TransactionTemplate.execute() 和声明式事务执行路径有何异同?

← 返回 **返回 事务管理索引**

Knowledge4J — Java 知识库