You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lambda代码是否处于同一事务?事务异常回滚相关技术问询

事务一致性问题解答

给定代码片段

事务性BizService类

@Override
@Transactional(rollbackFor = Exception.class)
public void rollbackCredit(List<Order> orderList) {
    // omitted biz code
}

TransactionalHelper类与Operation接口

public class TransactionalHelper {

    @Transactional(
        rollbackFor = {Exception.class}
    )
    public void transactionOperation(final Operation operation) {
        operation.execute();
    }

}


public interface Operation {
    void execute();
}

业务调用代码

transactionalHelper.transactionOperation(() -> {
    // call service method with @Transactional
    bizService.rollbackCredit(orderList);
    // db operation
    orderRepository.batchUpdateOptional(orderList, "orderStatusCode");
    // db operation
    orderLogRepository.batchInsertSelective(logList);
});

问题解答

1. Lambda中的代码是否运行在同一个事务中?

是,Lambda内的所有代码都运行在TransactionalHelper.transactionOperation方法开启的同一个事务中。

Spring的@Transactional默认传播级别为PROPAGATION_REQUIRED,规则是:如果当前已有事务,则加入该事务;如果没有则新建事务。transactionOperation方法开启事务后执行Lambda逻辑,bizService.rollbackCredit上的@Transactional会直接复用当前已存在的事务,不会新建独立事务。

2. 若orderLogRepository.batchInsertSelective(logList)抛出异常,其他方法的数据变更是否会持久化?

不会,所有数据变更都会被回滚,不会持久化到数据库。

transactionalHelper.transactionOperation的@Transactional配置了rollbackFor = {Exception.class},意味着只要抛出任意Exception类型异常(包括运行时异常和检查型异常),都会触发事务回滚。整个Lambda逻辑在同一个事务中执行,任何一步抛出符合回滚条件的异常,整个事务都会被撤销,之前执行的rollbackCredit、batchUpdateOptional中的数据变更都会被全部回滚。


内容的提问来源于stack exchange,提问作者Holinc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 14:55:59