Spring七种声明式事务传播机制深度解析:内外层行为与异常处理

1. REQUIRED(需要事务)

  • 行为: 内层加入外层事务,若无外层事务则新建。
  • 场景: 确保操作整体一致。

代码示例

java 复制代码
@Service
public class UserService {
    @Autowired private UserRepository userRepo;
    @Autowired private OrderService orderService;

    @Transactional(propagation = Propagation.REQUIRED)
    public void createUserAndOrder(String username) {
        userRepo.save(new User(username));
        orderService.createOrder(username);
    }
}

@Service
public class OrderService {
    @Autowired private OrderRepository orderRepo;

    @Transactional(propagation = Propagation.REQUIRED)
    public void createOrder(String username) {
        orderRepo.save(new Order(username));
        throw new RuntimeException("Order failed");
    }
}
  • 结果: 内外层共用事务A,异常后整体回滚。

2. SUPPORTS(支持事务)

  • 行为: 有外层事务则加入,无则非事务执行。
  • 场景: 查询等轻量操作。

代码示例

java 复制代码
@Transactional(propagation = Propagation.SUPPORTS)
public void logOperation(String operation) {
    logRepo.save(new Log(operation));
}
  • 结果: 外层有事务则加入,无事务则独立执行。

3. MANDATORY(强制事务)

  • 行为: 必须有外层事务,否则抛异常。
  • 场景: 强制事务环境。

代码示例

java 复制代码
@Transactional(propagation = Propagation.MANDATORY)
public void mandatoryOperation(String data) {
    dataRepo.save(new Data(data));
}
  • 结果 : 无外层事务抛IllegalTransactionStateException。

4. REQUIRES_NEW(需要新事务)

  • 行为: 内层新建事务,外层事务挂起。
  • 场景: 独立提交子操作。

代码示例

java 复制代码
@Service
public class TransactionService {
    @Autowired private LogRepository logRepo;

    @Transactional(propagation = Propagation.REQUIRED)
    public void outerMethod() {
        logRepo.save(new Log("Outer"));
        innerMethod();
        throw new RuntimeException("Outer failed");
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void innerMethod() {
        logRepo.save(new Log("Inner"));
    }
}
  • 结果: 内层事务提交,外层事务回滚。

5. NOT_SUPPORTED(不支持事务)

  • 行为: 内层非事务执行,外层事务挂起。
  • 场景: 无事务需求操作。

代码示例

java 复制代码
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void nonTransactionalOperation(String data) {
    dataRepo.save(new Data(data));
}
  • 结果: 内层无事务,外层事务暂停。

6. NEVER(从不支持事务)

  • 行为: 内层非事务执行,外层有事务则抛异常。
  • 场景: 禁止事务环境。

代码示例

java 复制代码
@Transactional(propagation = Propagation.NEVER)
public void neverTransactionalOperation(String data) {
    dataRepo.save(new Data(data));
}
  • 结果 : 外层有事务抛IllegalTransactionStateException。

7. NESTED(嵌套事务)

  • 行为: 内层嵌套于外层事务,可独立回滚。
  • 场景: 子操作独立控制。

代码示例

java 复制代码
@Service
public class NestedService {
    @Autowired private LogRepository logRepo;

    @Transactional(propagation = Propagation.REQUIRED)
    public void outerMethod() {
        logRepo.save(new Log("Outer"));
        try {
            innerMethod();
        } catch (Exception e) {}
    }

    @Transactional(propagation = Propagation.NESTED)
    public void innerMethod() {
        logRepo.save(new Log("Inner"));
        throw new RuntimeException("Inner failed");
    }
}
  • 结果: 内层回滚,外层提交。

传播行为细化表格

传播行为 外层有事务时 外层无事务时 内层事务行为 外层回滚 内层回滚
REQUIRED 内层加入外层事务 内层新建事务 与外层共用事务 是(整体回滚) 是(整体回滚)
SUPPORTS 内层加入外层事务 内层非事务执行 随外层事务状态 是(随外层) 是(随外层)
MANDATORY 内层加入外层事务 抛异常 与外层共用事务 是(整体回滚) 是(整体回滚)
REQUIRES_NEW 外层挂起,内层新建 内层新建事务 独立事务 是(不影响内层) 是(不影响外层)
NOT_SUPPORTED 外层挂起,内层非事务 内层非事务执行 无事务 否(暂停期间) 否(无事务)
NEVER 抛异常 内层非事务执行 无事务 否(无执行) 否(无事务)
NESTED 内层嵌套外层事务 内层新建事务 嵌套事务(可独立回滚) 是(整体回滚) 是(独立回滚)

总结

Spring事务传播机制的核心在于内外层事务的协调:

  • 一致性强 : REQUIRED和MANDATORY适合整体事务。
  • 独立性强 : REQUIRES_NEW和NESTED适合子操作隔离。
  • 无事务需求 : NOT_SUPPORTED和NEVER避免事务开销。
相关推荐
lizhongxuan5 分钟前
让 AI 提效转化为团队交付
后端
颜进强23 分钟前
23 · NestJs ModuleRef 模块引用:容器递给你的"取货窗口",四个 API 四种语义
前端·后端·ai编程
captain37625 分钟前
Maven
java·后端·idea
hsfxuebao26 分钟前
Loop Engineering 已死? 一文带你了解Graph Engineering
人工智能·后端
颜进强1 小时前
22 · NestJs InjectionScopes 注入作用域:默认单例不是偷懒,是最优——以及何时才该打破
前端·后端·ai编程
rannn_1111 小时前
【Java面试题】高频面试题1|Java 后端、MySQL、Redis 与 RAG 面试整理
java·jvm·数据库·后端·面试
拖孩1 小时前
一个全程 AI 写的小程序「厨菜记」,上线 20 天跑通流量主,收入几块钱,开心得不行
前端·后端·微信小程序
颜进强1 小时前
21 · NestJs AsyncProviders 异步提供者:useFactory 返回 Promise 之后,容器发生了什么
前端·后端·ai编程
Mikko72 小时前
JVM 线上排查实战(七):jps 看不到进程、jstack 报不允许的操作怎么办?attach 失败的六种情况实测
java·运维·jvm·后端
小宋10212 小时前
Agent 工具升级如何不破坏线上:Tool Schema 版本兼容与契约测试
java·人工智能·后端·spring