当前位置: 首页 > ops >正文

@Transactional高级用法之传播机制

一、传播机制核心概念

在Spring事务管理中,传播机制(Propagation) 定义了多个事务方法相互调用时事务如何传播的规则。Propagation.REQUIRED是Spring事务的默认传播行为,也是企业应用中最常用的传播设置。

REQUIRED的核心语义

  • 当前存在事务:加入当前事务,成为事务的一部分
  • 当前无事务:创建新事务,作为独立事务执行
  • 统一提交回滚:无论嵌套多少层,整个调用链共享同一个事务边界

二、REQUIRED的六大应用场景

场景1:单一服务方法调用(默认场景)

@Service
public class OrderService {@Transactional(propagation = Propagation.REQUIRED)public void createOrder(Order order) {// 订单核心业务逻辑orderDao.save(order);inventoryService.reduceStock(order.getItems());}
}

行为分析

  • 当外部调用createOrder()时,创建新事务
  • 所有数据库操作在同一个事务中执行
  • 任一操作失败将导致整个事务回滚

场景2:嵌套服务方法调用

@Service
public class OrderService {@Transactional(propagation = Propagation.REQUIRED)public void processOrder(Order order) {validateOrder(order);          // 调用REQUIRED方法paymentService.charge(order);  // 调用其他服务的REQUIRED方法deliverOrder(order);}@Transactional(propagation = Propagation.REQUIRED)public void validateOrder(Order order) {// 订单验证逻辑}
}@Service
public class PaymentService {@Transactional(propagation = Propagation.REQUIRED)public void charge(Order order) {// 支付处理逻辑}
}

事务传播图

┌──────────────────────────────┐
│         processOrder         │
│  (Transaction T1 - REQUIRED) │
│                              │
│  ├─ validateOrder (T1)       │
│  ├─ charge (T1)              │
│  └─ deliverOrder (T1)        │
└──────────────────────────────┘

关键特性

  • 所有方法共享同一个事务上下文
  • validateOrder()中的异常会回滚整个事务
  • 支付服务中的操作与订单服务在同一个事务中

场景3:REQUIRED与SUPPORTS组合

public class ReportService {@Transactional(propagation = Propagation.SUPPORTS)public OrderReport generateReport(Long orderId) {Order order = orderService.getOrder(orderId);  // REQUIRED方法return buildReport(order);}
}@Service
public class OrderService {@Transactional(propagation = Propagation.REQUIRED)public Order getOrder(Long orderId) {return orderRepository.findById(orderId);}
}

行为分析

  • generateReport():SUPPORTS传播(有事务则加入,无事务则非事务执行)
  • 当在事务中调用时:getOrder()加入当前事务
  • 当非事务调用时:getOrder()创建新事务

场景4:REQUIRED与NOT_SUPPORTED组合

@Transactional(propagation = Propagation.REQUIRED)
public void processBatchOrders(List<Order> orders) {for (Order order : orders) {// 挂起事务执行非关键操作auditService.logOperation(order);  // NOT_SUPPORTEDprocessSingleOrder(order);         // REQUIRED}
}@Service
public class AuditService {@Transactional(propagation = Propagation.NOT_SUPPORTED)public void logOperation(Order order) {// 审计日志记录(非关键操作)}
}

事务状态变化

主事务T1(REQUIRED)├─ 挂起T1├─ logOperation(非事务执行)├─ 恢复T1└─ processSingleOrder(T1中执行)

适用场景:非关键操作(如日志记录)不需要事务支持

场景5:REQUIRED与MANDATORY组合

public class OrderValidator {@Transactional(propagation = Propagation.MANDATORY)public void validate(Order order) {// 必须在事务中执行验证}
}@Service
public class OrderService {@Transactional(propagation = Propagation.REQUIRED)public void createOrder(Order order) {orderValidator.validate(order);  // MANDATORY方法// 其他业务逻辑}
}

行为特点

  • validate()方法必须在外层事务中执行
  • 若在非事务环境调用将抛出IllegalTransactionStateException
  • 确保关键验证操作在事务上下文中执行

场景6:异常处理与回滚规则

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = BusinessException.class,noRollbackFor = ValidationException.class)
public void processOrder(Order order) {try {validateOrder(order); // 可能抛出ValidationExceptionprocessPayment(order);} catch (ValidationException e) {// 验证异常不回滚事务handleValidationError(e);}
}private void processPayment(Order order) {if (paymentFailed) {throw new BusinessException("支付失败");}
}

回滚规则

  • BusinessException触发事务回滚
  • ValidationException不会触发回滚
  • 其他RuntimeException默认触发回滚

三、REQUIRED的底层实现机制

1. 事务传播处理流程

public abstract class TransactionAspectSupport {protected Object invokeWithinTransaction(Method method, Class<?> targetClass, final InvocationCallback invocation) {// 获取事务属性TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(method, targetClass);// 获取事务管理器PlatformTransactionManager tm = determineTransactionManager(txAttr);// 创建事务(处理传播行为)TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);try {// 执行业务方法Object retVal = invocation.proceedWithInvocation();// 提交事务commitTransactionAfterReturning(txInfo);return retVal;} catch (Throwable ex) {// 异常回滚处理completeTransactionAfterThrowing(txInfo, ex);throw ex;} finally {cleanupTransactionInfo(txInfo);}}
}

2. REQUIRED传播的源码实现

// AbstractPlatformTransactionManager
private TransactionStatus handleExistingTransaction(TransactionDefinition definition, Object transaction, boolean debugEnabled) {// REQUIRED传播行为处理if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED) {// 嵌套事务处理if (isNestedTransactionAllowed()) {return prepareTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, null);}// 加入现有事务return prepareTransactionStatus(definition, transaction, false, newSynchronization, debugEnabled, null);}// 其他传播行为处理...
}

3. 事务同步管理

public abstract class TransactionSynchronizationManager {// 当前事务状态存储private static final ThreadLocal<Map<Object, Object>> resources = new NamedThreadLocal<>("Transactional resources");// 事务同步回调private static final ThreadLocal<Set<TransactionSynchronization>> synchronizations = new NamedThreadLocal<>("Transaction synchronizations");// 当前事务名称private static final ThreadLocal<String> currentTransactionName = new NamedThreadLocal<>("Current transaction name");
}

四、REQUIRED的最佳实践与陷阱规避

最佳实践

  1. 事务粒度控制:REQUIRED方法应保持精简(<3秒)

    @Transactional(propagation = Propagation.REQUIRED, timeout = 5)
    public void quickOperation() { ... }
    
  2. 异常声明明确化:显式指定回滚异常

    @Transactional(rollbackFor = {BusinessException.class, DataAccessException.class})
    
  3. 读写分离优化:查询方法使用只读事务

    @Transactional(propagation = Propagation.REQUIRED, readOnly = true)
    public Order getOrderDetails(Long id) { ... }
    

常见陷阱与解决方案

陷阱1:长事务问题

// 危险:可能造成长事务
@Transactional(propagation = Propagation.REQUIRED)
public void processLargeBatch(List<Data> items) {for (Data item : items) { // 循环处理大量数据processItem(item);}
}// 优化方案:分批次处理
public void safeBatchProcess(List<Data> items) {int batchSize = 100;for (int i = 0; i < items.size(); i += batchSize) {List<Data> batch = items.subList(i, Math.min(i + batchSize, items.size()));processBatch(batch);}
}@Transactional(propagation = Propagation.REQUIRED)
public void processBatch(List<Data> batch) {batch.forEach(this::processItem);
}

陷阱2:异常处理不当

// 错误:异常被吞没
@Transactional
public void processOrder() {try {paymentService.charge(); // 可能抛出PaymentException} catch (PaymentException e) {// 未标记回滚,事务继续提交!log.error("支付失败", e);}
}// 正确:标记回滚状态
@Transactional
public void safeProcessOrder() {try {paymentService.charge();} catch (PaymentException e) {// 手动标记回滚TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();throw new BusinessException("支付失败", e);}
}

陷阱3:跨服务事务不一致

// 错误:跨服务调用事务不一致
@Transactional(propagation = Propagation.REQUIRED)
public void createOrder(Order order) {orderRepository.save(order);// 远程调用:不在同一事务中!inventoryService.updateStock(order.getItems()); 
}// 解决方案:分布式事务框架
@Transactional(propagation = Propagation.REQUIRED)
public void distributedTransaction() {// 本地事务操作orderRepository.save(order);// 分布式事务参与方try {inventoryService.updateStockInTransaction(order.getItems());} catch (Exception e) {// 触发全局回滚GlobalTransactionContext.reload(RootContext.getXID()).rollback();throw e;}
}

五、REQUIRED在不同架构中的应用

1. 单体应用架构

@Service
public class OrderFacadeService {@Transactional(propagation = Propagation.REQUIRED)public void placeOrder(OrderDTO dto) {// 协调多个领域服务Order order = orderFactory.create(dto);orderService.validate(order);paymentService.process(order);inventoryService.adjustStock(order);notificationService.sendConfirmation(order);}
}

2. 微服务架构(Saga模式)

@Transactional(propagation = Propagation.REQUIRED)
public void createOrderSaga(Order order) {// 步骤1:本地事务orderRepository.save(order);// 步骤2:发布领域事件eventPublisher.publish(new OrderCreatedEvent(order));
}// 事件处理器(独立事务)
@Transactional(propagation = Propagation.REQUIRED)
@EventListener
public void handleOrderCreated(OrderCreatedEvent event) {// 调用库存服务inventoryClient.reserveStock(event.getOrderItems());
}

3. 领域驱动设计(DDD)

@DomainService
public class OrderDomainService {@Transactional(propagation = Propagation.REQUIRED)public void confirmOrder(Order order) {// 领域逻辑处理order.confirm();// 基础设施操作orderRepository.save(order);domainEventPublisher.publish(new OrderConfirmedEvent(order));}
}

六、总结与展望

Propagation.REQUIRED作为Spring事务的默认传播机制,其核心价值在于:

  1. 事务统一性:确保业务操作在统一的事务边界内执行
  2. 资源高效性:复用现有事务,避免不必要的连接创建
  3. 编程简洁性:声明式事务管理简化开发复杂度
http://www.xdnf.cn/news/9426.html

相关文章:

  • 基于对比学习的推荐系统开发方案,使用Python在PyCharm中实现
  • CSS3实现的账号密码输入框提示效果
  • 【25-cv-05894】Keith律所代理Jennifer Le Feuvre版权画
  • 大数据-273 Spark MLib - 基础介绍 机器学习算法 决策树 分类原则 分类原理 基尼系数 熵
  • pikachu靶场通关笔记06 XSS关卡02-反射型POST
  • 私有化部署DeepSeek后行业数据模型的训练步骤
  • 数字孪生赋能智能制造:某汽车发动机产线优化实践
  • Function calling和mcp区别
  • HTML5基础
  • 人工智能100问☞第35问:什么是Transformer模型?
  • 数据库-算法学习C++(入门)
  • Android-kotlin协程学习总结
  • 如何通过创新科技手段打造美术馆展厅互动体验,提升观众沉浸感?
  • 《P5507 机关》
  • java操作服务器文件(把解析过的文件迁移到历史文件夹地下)
  • VM改MAC电脑密码(截图)
  • 佰力博科技与您探讨DEAI介电阻抗分析仪的特点
  • day023-网络基础与OSI七层模型
  • 变色龙Ultra编译指南:从零开始
  • Python爬虫实战:抓取百度15天天气预报数据
  • Dropout 在大语言模型中的应用:以 GPT 和 BERT 为例
  • Oracle RMAN 备份脚本
  • 【GraphQL】深入解析 Apollo Client:从架构到实践的一站式 GraphQL 解决方案
  • [java八股文][JavaSpring面试篇]Mybatis
  • 英语写作中“表达、表述”expression statement 的用法
  • 题海拾贝:P1208 [USACO1.3] 混合牛奶 Mixing Milk
  • 构建安全高效的邮件网关ngx_mail_ssl_module
  • 4.8.1 利用Spark SQL实现词频统计
  • 2025人脸识别备案新规:企业个人权益保障
  • 青少年编程与数学 02-020 C#程序设计基础 08课题、字符和字符串