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
相关产品推荐
相关产品推荐

