我有这样的代码
对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
回滚事务 - 所有事务回滚
- 错误将被抛出/在链中进一步传播