Spring @Transactional. Сохранить сущность в главном потоке и выбрать в новом потоке за одну транзакцию - PullRequest
0 голосов
/ 27 августа 2018

У меня есть метод в моем сервисе:

@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 части логика:

  1. saveImportChargesRequest - создать некоторый объект, сохранить вDB и возврат id(guid)

  2. 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-----------

Но я не знаю, исправить эту реализацию или нет.И как я могу исправить первую реализацию - сохранить данные в основном потоке и выбрать в новом потоке за одну транзакцию?

1 Ответ

0 голосов
/ 27 августа 2018

Зачем вам нужна вторая нить? Пожалуйста, попробуйте удалить второй поток и использовать только один. Если вам все еще нужен второй поток, тогда вам нужно зафиксировать первую транзакцию, прежде чем получить результат, как вы уже сделали. Вы также должны знать, что при втором подходе у вас возникнут проблемы с откатом транзакций, если вам нужно очистить все сохраненные данные. Поэтому хорошо, если вы решите сделать это в одном потоке.

...