Данные Spring: как синхронизировать транзакцию между несколькими экземплярами - PullRequest
1 голос
/ 22 января 2020

Я пишу потребителю, который должен обрабатывать данные, написанные производителем. Как только производитель закончит запись, потребитель должен начать обработку данных, принадлежащих указанному c providerExecutionId. Я определил сущность ConsumerExecution, чтобы повторять обработку потребителя.

Проблема в том, что потребитель фактически работает в нескольких экземплярах, и мне требуется только один шаг для обработки каждого вывода выполнения производителя.

Приведенный ниже код не синхронизируется между экземплярами-получателями:

@Transactional
public ConsumerExecution initiateConsumerExecutionIfNeeded(String producerExecutionId) {
    consumerExecution lastConsumerExecution = consumerExecutionRepository.findTopByOrderByIdDesc();
    if (lastConsumerExecution != null && producerExecutionId.equals(lastConsumerExecution.getProducerExecutionId())) {
        return null;
    }

    consumerExecution consumerExecution = new ConsumerExecution(producerExecutionId);
    consumerExecutionRepository.save(consumerExecution);
    return consumerExecution;
}

Добавление @Transactional не является достаточным, поскольку не помешает двум экземплярам успешно создать ConsumerExecution и сохранить его.

It Кажется, мне нужен какой-то способ заблокировать всю таблицу, но, похоже, @Lock не может обеспечить эту функциональность.

Может быть, мне следует как-то добавить к findTopByOrderByIdDes c что-то вроде: WITH (TABLOCK, HOLDLOCK), как в здесь ?

...