一、核心概念理解首先要明确事务传播机制Propagation解决的是当一个事务方法被另一个事务方法调用时这个方法的事务该如何与调用方的事务进行交互的问题。简单来说就是定义了 “新事务” 和 “旧事务” 之间的关系规则Spring 把这些规则封装成了Propagation枚举类所有传播行为都基于这个枚举定义。二、Spring 事务传播机制的 7 种类型Spring 提供了 7 种核心的事务传播行为我会按 “常用程度 易理解性” 排序讲解每个类型都包含含义和代码示例1. REQUIRED默认值必要的含义如果当前存在事务就加入这个事务如果当前没有事务就新建一个事务。这是最常用的传播机制。场景绝大多数业务场景如下单扣库存、支付扣余额都用这个保证操作在同一个事务里。代码示例import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; Service public class OrderService { // 调用方方法 Transactional(propagation Propagation.REQUIRED) public void createOrder() { // 1. 保存订单 saveOrder(); // 2. 调用库存服务扣减库存被调用方 stockService.deductStock(); } Service public class StockService { // 被调用方方法 Transactional(propagation Propagation.REQUIRED) public void deductStock() { // 扣减库存逻辑 } } }执行逻辑调用createOrder()时没有现有事务会新建一个事务执行deductStock()时发现已有事务就加入这个事务两个方法的操作要么都成功提交要么都回滚。2. SUPPORTS支持的含义如果当前存在事务就加入这个事务如果当前没有事务就以非事务方式执行。场景查询类方法如查询订单详情有事务时就跟着事务走没有也不强制创建。Transactional(propagation Propagation.SUPPORTS) public OrderVO getOrderDetail(Long orderId) { // 查询订单逻辑无修改操作 return orderMapper.selectById(orderId); }3. MANDATORY强制的含义必须在现有事务中执行如果当前没有事务直接抛出IllegalTransactionStateException异常。场景必须依赖外层事务的核心修改操作如订单状态更新必须在下单 / 支付的事务中执行。Transactional(propagation Propagation.MANDATORY) public void updateOrderStatus(Long orderId, Integer status) { orderMapper.updateStatus(orderId, status); } // 如果直接调用这个方法无外层事务会抛异常只有被其他事务方法调用才会执行。4. REQUIRES_NEW新建的含义无论当前是否有事务都新建一个独立的事务如果原有事务存在会先暂停原有事务新事务执行完后再恢复原有事务。场景日志记录、消息发送等 “不希望被主事务回滚影响” 的操作。Service public class OrderService { Transactional(propagation Propagation.REQUIRED) public void createOrder() { saveOrder(); // 主事务操作 logService.recordLog(); // 调用新建事务的方法 int i 1 / 0; // 制造异常主事务回滚 } } Service public class LogService { Transactional(propagation Propagation.REQUIRES_NEW) public void recordLog() { // 记录订单创建日志 logMapper.insert(new Log(创建订单, LocalDateTime.now())); } }执行逻辑recordLog()会新建独立事务执行完就提交即使createOrder()后续抛异常回滚日志记录也不会回滚因为是独立事务。5. NOT_SUPPORTED不支持的含义以非事务方式执行如果当前有事务会先暂停原有事务执行完后再恢复原有事务。场景耗时较长的非核心操作如导出报表避免占用事务资源导致事务超时。6. NEVER从不含义必须以非事务方式执行如果当前存在事务直接抛出IllegalTransactionStateException异常。场景完全不允许在事务中执行的操作如纯查询且对性能要求极高的统计操作。Transactional(propagation Propagation.NEVER) public Long countAllOrders() { return orderMapper.count(); } // 如果被事务方法调用会抛异常只有直接调用无事务才会执行。7. NESTED嵌套的含义如果当前有事务就在这个事务里创建一个嵌套事务子事务如果没有就新建一个事务。核心特点嵌套事务依赖外层事务外层事务回滚时嵌套事务也会回滚但嵌套事务可以独立回滚不影响外层事务这是和REQUIRED的核心区别底层依赖数据库的保存点Savepoint功能所以需要数据库支持如 MySQL InnoDB。Service public class OrderService { Transactional(propagation Propagation.REQUIRED) public void createOrder() { saveOrder(); // 外层事务操作 try { stockService.deductStock(); // 嵌套事务 } catch (Exception e) { // 嵌套事务回滚外层事务继续执行 log.error(扣减库存失败, e); } // 外层事务最终提交saveOrder() 会生效deductStock() 已回滚 } } Service public class StockService { Transactional(propagation Propagation.NESTED) public void deductStock() { // 扣减库存逻辑若失败则回滚自身不影响外层 int i 1 / 0; // 制造异常 } }三、关键对比易混淆类型类型核心区别REQUIRED与外层事务共用一个事务同生共死REQUIRES_NEW新建独立事务外层事务不影响内层NESTED嵌套事务内层回滚不影响外层外层回滚影响内层总结核心作用事务传播机制定义了 “方法间调用时事务的交互规则”解决多事务方法嵌套调用的事务边界问题。常用类型REQUIRED默认共用事务、REQUIRES_NEW独立事务、SUPPORTS查询用是日常开发中最常使用的三种。关键注意NESTED依赖数据库保存点而REQUIRES_NEW是完全独立的事务二者不要混淆传播机制仅在Spring 管理的事务方法间调用时生效如非 public 方法、内部调用会失效。