У меня есть метод в моем сервисе:
@Slf4j
@Component
public class ImportChargesHandler implements SendRequestHandler {
...
@Override
@Transactional
public void process(SendRequestRequest request, String fullRequest) {
String guid = sendRequestService.saveImportChargesRequest(...);
taskExecutor.execute(() -> importChargesOperation.importChargesRequest(request, guid));
}
}
в этом методе у меня есть 2 части логика:
saveImportChargesRequest
- создать некоторый объект, сохранить вDB и возврат id(guid)
importChargesRequest
- вызвать новую тему.Я передаю сохраненный id(guid)
и использую в этом методе (make select by guid)
Но когда я сохраняю объект в БД в первом методе и передаю идентификатор во второй метод, когда я делаю selectпо идентификатору во второй метод я получаю исключение (сущность не найдена) или результат успеха.Я думаю, это происходит потому, что, когда я делаю метод select - save из предыдущего метода, данные не сохраняются, и я не знаю об этих данных.
Я пытался saveAndFlush()
при сохранении объекта в БД - когда я могу выбрать данные ужепокраснел, и я могу выбрать его.Но иногда я не могу выбрать не имеет значения.
-> start main method with @Transactional
------transaction begin------------
-> start fist internal method for save entity
-> save entity
-> flush
-> return id
-----start new thread------------
-> start second method
-> select entity by id(id from first method)
-> exception(not found) or success select(it depends)
------transaction commit-----------
Теперь я удалил @Transactional
из основного метода.И первый и второй метод имеет @Transactional
.У меня есть этот логик
-> start main method without @Transactional
------transaction begin------------
-> start fist internal method for save entity
-> save entity
-> flush
-> return id
------transaction commit-----------
-----start new thread------------
------transaction begin------------
-> start second method
-> select entity by id(id from first method)
-> success select
------transaction commit-----------
Но я не знаю, исправить эту реализацию или нет.И как я могу исправить первую реализацию - сохранить данные в основном потоке и выбрать в новом потоке за одну транзакцию?