事务失效场景(4)

多线程调用与Spring事务机制

问题原因

  1. Spring将事务状态存储在ThreadLocal变量中
  2. 新创建的线程无法访问父线程的ThreadLocal变量
  3. 导致子线程无法继承父线程的事务上下文

解决方案

  1. 避免在事务方法中创建新线程
  2. 使用编程式事务管理
  3. 使用分布式事务框架(如Seata)

异常捕获与Spring事务回滚机制

问题原因

  • 当异常在方法内部被try-catch块捕获并处理时,Spring的事务拦截器无法感知到这个异常

解决方案

  1. 在catch块中手动回滚事务
  2. 重新抛出异常
  3. 配置@Transactional注解的rollbackFor属性
@Transactional
public void someMethod() {
    try {
        // 业务代码
    } catch (Exception e) {
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
}

手动抛出异常错误

问题原因

  • Spring默认只对RuntimeException和Error进行事务回滚

解决方案

  1. 配置rollbackFor规则
  2. 将检查异常包装为运行时异常抛出
@Transactional(rollbackFor = {IOException.class, SQLException.class})
public void businessMethod() throws IOException {
    // 业务逻辑
}