跳转至

Spring事务管理核心原理与实战

一、事务管理架构总览

graph TD
    A[业务代码] --> B[事务拦截器]
    B --> C{事务属性解析}
    C -->|传播行为| D[事务创建/加入]
    C -->|隔离级别| E[数据库隔离设置]
    C -->|超时时间| F[事务超时配置]
    D --> G[目标方法执行]
    G --> H{是否抛出异常}
    H -->|是| I[事务回滚]
    H -->|否| J[事务提交]

二、核心实现原理详解

1. 事务传播机制

// REQUIRED:如果存在事务则加入,否则新建
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    methodB(); // 同一事务
}

// REQUIRES_NEW:总是新建事务,挂起当前事务
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
    // 新事务操作
}

传播级别决策树

graph LR
    A[REQUIRED] --> B{当前存在事务?}
    B -->|是| C[加入事务]
    B -->|否| D[新建事务]

    A[REQUIRES_NEW] --> E{当前存在事务?}
    E -->|是| F[挂起当前事务]
    E -->|否| G[新建事务]

2. 事务隔离级别

// 设置SERIALIZABLE隔离级别
@Transactional(isolation = Isolation.SERIALIZABLE)
public void transfer() {
    // 串行化操作
}

隔离级别对比表

隔离级别 脏读 不可重复读 幻读
READ_UNCOMMITTED
READ_COMMITTED
REPEATABLE_READ
SERIALIZABLE

3. 事务失效场景

// 失效场景1:非public方法
@Transactional
private void invalidMethod() {
    // 事务不生效
}

// 失效场景2:同类内部调用
public void methodA() {
    methodB(); // B方法事务失效
}

@Transactional
public void methodB() {
    // 事务不生效
}

三、底层实现原理

1. AOP代理机制

// 事务拦截器核心逻辑
public Object invoke(MethodInvocation invocation) throws Throwable {
    TransactionInfo txInfo = createTransactionIfNecessary(invocation.getMethod());
    try {
        return invocation.proceed();
    } catch (Throwable ex) {
        completeTransactionAfterThrowing(txInfo, ex);
        throw ex;
    } finally {
        cleanupTransactionInfo(txInfo);
    }
}

2. 事务状态管理

// DefaultTransactionStatus核心属性
public class DefaultTransactionStatus implements TransactionStatus {
    private final boolean isNewTransaction; // 是否新事务
    private final boolean isRollbackOnly;   // 是否仅回滚
    private int timeout;                    // 超时时间
    private boolean readOnly;               // 只读标志
}

四、工程实践指南

1. 最佳实践原则

// 服务层统一异常处理
@Service
public class UserService {

    @Transactional(rollbackFor = Exception.class)
    public void createUser(User user) {
        try {
            userDao.insert(user);
            profileDao.insert(user.getProfile());
        } catch (Exception e) {
            // 统一异常处理
            throw new ServiceException("创建用户失败", e);
        }
    }
}

2. 性能优化方案

# 数据库连接池配置(Druid示例)
spring.datasource.druid.initial-size=5
spring.datasource.druid.max-active=20
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-wait=60000

五、分布式事务扩展

// TCC事务框架使用示例
@Compensable(confirmMethod = "confirmTransfer", cancelMethod = "cancelTransfer")
public void transfer() {
    accountDao.debit(100);
    accountDao.credit(100);
}

// 确认方法
public void confirmTransfer() {
    // 业务确认逻辑
}

// 取消方法
public void cancelTransfer() {
    // 业务回滚逻辑
}

六、知识体系脑图

graph TD
    A[事务管理] --> B[ACID特性]
    A --> C[事务隔离]
    A --> D[传播机制]
    B --> E[原子性]
    B --> F[一致性]
    B --> G[隔离性]
    B --> H[持久性]
    C --> I[PROPAGATION_REQUIRED]
    C --> J[PROPAGATION_REQUIRES_NEW]
    D --> K[READ_COMMITTED]
    D --> L[REPEATABLE_READ]
graph TD
    A[事务管理] --> B[ACID特性]
    A --> C[事务隔离]
    A --> D[传播机制]
    B --> E[原子性]
    B --> F[一致性]
    B --> G[隔离性]
    B --> H[持久性]
    C --> I[PROPAGATION_REQUIRED]
    C --> J[PROPAGATION_REQUIRES_NEW]
    D --> K[READ_COMMITTED]
    D --> L[REPEATABLE_READ]

通过Spring事务管理,开发者可以专注于业务逻辑实现,而无需手动处理复杂的事务控制。合理选择事务传播行为和隔离级别,能有效平衡系统性能与数据一致性要求。