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

Spring Boot 七种事务传播行为只有 REQUIRES_NEW 和 NESTED 支持部分回滚的分析


Spring Boot 七种事务传播行为支持部分回滚的分析

支持部分回滚的传播行为
  • REQUIRES_NEW:始终开启新事务,独立于外部事务,失败时仅自身回滚。
  • NESTED:在当前事务中创建保存点(Savepoint),可局部回滚到保存点,不影响外部事务整体提交。

代码示例:使用 REQUIRES_NEW 实现部分回滚

1. 交易服务层(独立事务)
@Service
public class TransactionService {

    @Autowired
    private TradeRepository tradeRepository;

    // 使用 REQUIRES_NEW,每个交易独立事务
    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public void processTrade(Trade trade) {
        try {
            // 模拟业务逻辑(如保存交易)
            tradeRepository.save(trade);
            if (trade.getId() == 3) { // 模拟交易3失败
                throw new RuntimeException("Transaction 3 failed");
            }
        } catch (Exception e) {
            // 本地异常处理,但事务仍会回滚
            throw e;
        }
    }
}
2. 批量任务协调者
@Service
public class BatchProcessor {

    @Autowired
    private TransactionService transactionService;

    // 批量任务不开启事务(NOT_SUPPORTED)
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void executeBatch(List<Trade> trades) {
        for (Trade trade : trades) {
            try {
                transactionService.processTrade(trade);
            } catch (Exception e) {
                // 记录错误但继续处理其他交易
                System.out.println("Trade " + trade.getId() + " failed!");
            }
        }
    }
}
3. 测试用例
@SpringBootTest
public class BatchTest {

    @Autowired
    private BatchProcessor batchProcessor;
    @Autowired
    private TradeRepository tradeRepository;

    @Test
    public void testBatchProcessing() {
        List<Trade> trades = Arrays.asList(
                new Trade(1, "Success1"),
                new Trade(2, "Success2"),
                new Trade(3, "Failed")  // 交易3会失败
        );

        batchProcessor.executeBatch(trades);

        // 验证:交易1和2已提交,交易3未提交
        assertEquals(2, tradeRepository.count());
    }
}

代码示例:使用 NESTED 实现部分回滚

1. 交易服务层(嵌套事务)
@Service
public class TransactionService {

    @Autowired
    private TradeRepository tradeRepository;

    // 使用 NESTED,在外部事务中创建保存点
    @Transactional(propagation = Propagation.NESTED, rollbackFor = Exception.class)
    public void processTradeWithNested(Trade trade) {
        try {
            tradeRepository.save(trade);
            if (trade.getId() == 3) {
                throw new RuntimeException("Transaction 3 failed");
            }
        } catch (Exception e) {
            throw e; // 回滚到保存点,但外部事务可继续提交其他交易
        }
    }
}
2. 批量任务协调者(需开启外部事务)
@Service
public class BatchProcessor {

    @Autowired
    private TransactionService transactionService;

    // 开启外部事务(REQUIRED)
    @Transactional(propagation = Propagation.REQUIRED)
    public void executeBatchWithNested(List<Trade> trades) {
        for (Trade trade : trades) {
            try {
                transactionService.processTradeWithNested(trade);
            } catch (Exception e) {
                System.out.println("Trade " + trade.getId() + " failed!");
                // 继续处理其他交易
            }
        }
        // 手动提交外部事务(可选,但通常由Spring自动管理)
    }
}

传播行为对比表格

传播行为是否支持部分回滚适用场景代码示例方法
REQUIRED❌ 不支持继承父事务,失败时所有操作回滚-
REQUIRES_NEW✅ 支持独立事务,失败不影响其他交易processTrade()
SUPPORTS❌ 不支持无事务或依赖父事务-
NOT_SUPPORTED❌ 不支持挂起父事务,无事务执行-
MANDATORY❌ 不支持必须存在父事务-
NEVER❌ 不支持禁止存在父事务-
NESTED✅ 支持在父事务中创建保存点,局部回滚processTradeWithNested()

关键说明

  1. REQUIRES_NEW

    • 每个交易独立开启事务,失败时仅自身回滚,其他交易不受影响。
    • 适用场景:完全独立的交易,彼此无依赖。
  2. NESTED

    • 在父事务中创建保存点,失败时回滚到保存点,但父事务仍可提交。
    • 适用场景:交易间有弱关联,需局部回滚但整体提交成功。

注意:使用 NESTED 需确保数据库和驱动支持保存点(如MySQL/PostgreSQL)。

相关文章:

  • C++26新特性解读: 结构化绑定作为条件
  • 在linux中GCC、Yum 与 Apt - get 的区别
  • OCRmyPDF 开源核弹
  • PyCharm 下载与安装教程:从零开始搭建你的 Python 开发环境
  • 【江协科技STM32】PWR电源控制(学习笔记)
  • 排序算法-插入排序
  • Tomcat深度解析:Java Web服务的核心引擎
  • Java 线程池与 Kotlin 协程 高阶学习
  • 子网划分2
  • OSPF五种数据包详解
  • FPGA实现LED流水灯
  • Leetcode 3500. Minimum Cost to Divide Array Into Subarrays
  • Spring IOC:容器管理与依赖注入秘籍
  • RK3568 pinctrl内容讲解
  • Python----机器学习(距离计算方式:欧式距离,曼哈顿距离,切比雪夫距离,余弦相似度,汉明距离,闵可夫斯基距离,Jaccard指数,半正矢距离)
  • 探索PHP的未来发展与应用趋势
  • Java面试黄金宝典27
  • transformer架构与其它架构对比
  • K8S学习之基础六十六:Rancher部署
  • Kafka延迟队列实现分级重试
  • 郭少雄导演逝世,享年82岁
  • 塞尔维亚总统因突发健康问题,中断对美国的正式访问并回国
  • 9米长林肯车开进“皖南川藏线”致拥堵数小时,车主回应称将配合调查
  • 辽宁省委书记、省长连夜赶赴辽阳市白塔区火灾事故现场,指导善后处置工作
  • 匈牙利国会通过退出国际刑事法院的决定
  • 发出“美利坚名存实亡”呼号的卡尼,将带领加拿大走向何方?