My use case:
- Read data
- Save data to DB
- Invoke REST service that will read just saved data
The trouble is that the current transaction is not committed and the called service does not see them. I tried to split the method to more methods that have their own transaction.
@Service
public class ReportService {
private final MyFeignClient feignClient;
@EventListener
@Transactional(propagation = Propagation.REQUIRED)
public void handleUploadedFile(MyEvent event) {
final var dataHeader = saveReportData(event);
validate(dataHeader);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public DataHeader saveReportData(MyEvent event) {
var dataHeader = DataHeader.builder()
.event(event)
.createdTs(LocalDateTime.now())
.build();
return dataHeaderRepository.save(dataHeader);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void validate(DataHeader dataHeader) {
try {
final var response = feignClient.execute(ValidateRequest.builder()
.dataHeaderId(dataHeader.getId())
.build());
} catch (Exception e) {
log.error("Failed for DataHeader {}", e, dataHeader.getId());
}
}
}
What I am considering is to manage transactions manually, unless there is a better way.