事务和嵌套方法调用



我有这样的代码

updatePerson方法的调用

@Service
@RequiredArgsConstructor
@Slf4j
public class PersonManager {
@Transactional
public void updatePerson(PersonPayload personPayload, String uid) {
Person person = personRepository.findByUid(uid);
personProcessManager.createLog(person);
Person personDuplicate = new Person();
personDuplicate.copyPerson(person);
personMapper.updatePerson(personPayload,personDuplicate);
personRepository.save(person);
personRepository.save(personDuplicate);
personProcessManager.createLog(personDuplicate);
}
}
@Service
@RequiredArgsConstructor
@Slf4j
public class PersonProcessManager {
@Transactional
public Log createLog(Person person) {
return createLog(person,
LogTypeEnum.CHANGE.getId(),
LogStatusEnum.COPY.getId());
}
private Log createLog(Person person, Long logTypeId, Long statusLogId) {
Log log = new Log();
log.setLogType(1);
log.setLogStatus(2);
log.setDateCreation(LocalDate.now());
log.setPerson(person);
return logRepository.save(person);
}
}

如果在createLog的私有方法中发生错误,是否会发生任何回滚?

这取决于你如何设置。

让我们看看嵌套事务是如何工作的:Spring有一个事务管理器,它维护并将所有嵌套事务推入堆栈,当嵌套事务完成后,它会弹出。

另一件要知道的好事是@Transactional属性默认情况下使用错误传播回称为REQUIRED的父属性。

为了对Transactional属性进行微调,需要将传播属性@Transactional(propagation =Propagation.REQUIRES_NEW)添加到注释中。您可以阅读更多关于事务传播的信息。

在您的具体情况下:

  • 私有createLog发生错误
  • 将错误发送到公共createLog
  • 公共PersonProcessManager.createLog事务回滚
  • 将错误传播给父进程,父进程是一个公共updatePerson
  • 公共PersonManager.updatePerson回滚事务
  • 所有事务回滚
  • 错误将被抛出/在链中进一步传播

相关内容

  • 没有找到相关文章

最新更新