Пакет Spring с MongoDB и транзакциями

У меня есть приложение Spring Batch с двумя базами данных: одна база данных SQL для метаданных Spring Batch, а другая - MongoDB, в которой хранятся все бизнес-данные. Отношение БД по-прежнему использует DataSourceTransactionManager. Однако я не думаю, что запись Mongo выполняется в рамках активной транзакции с откатами. Вот выдержка из официальная документация Spring Batch на MongoItemWriter:

Реализация ItemWriter, которая записывает в хранилище MongoDB, используя реализацию MongoOperations Spring Data. Поскольку MongoDB не является хранилищем транзакций, прилагаются все усилия, чтобы сохранить записанные данные в последний момент, но при этом соблюдают контракты о статусе задания. При возникновении ошибки во время записи попытки отката не предпринимаются.

Однако это уже не так; MongoDB представил транзакции ACID в версии 4. Как мне добавить транзакции в мои пишет? Я мог бы использовать @Transactional в своих методах обслуживания, когда использую ItemWriterAdapter. Но все еще не знаю, что делать с _5 _... Какая здесь правильная конфигурация? Спасибо.


person BlackLog    schedule 01.03.2021    source источник


Ответы (1)


У меня есть приложение Spring Batch с двумя базами данных: одна база данных SQL для метаданных Spring Batch, а другая - MongoDB, в которой хранятся все бизнес-данные.

Я предлагаю вам взглянуть на следующие посты, чтобы понять значение этого выбора дизайна:

В вашем случае у вас есть распределенная транзакция между двумя источниками данных:

  • Источник данных SQL для репозитория заданий, которым управляет DataSourceTransactionManager
  • MongoDB для вашего шага (с использованием MongoItemWriter), которым управляет MongoTransactionManager

Если вы хотите, чтобы технические метаданные и бизнес-данные фиксировались / откатывались в рамках одной и той же распределенной транзакции, вам необходимо использовать JtaTransactionManager, который координирует DataSourceTransactionManager и MongoTransactionManager. Вы можете найти ресурсы по этому поводу здесь: https://stackoverflow.com/a/56547839/5019386.

Кстати, есть запрос функции для использования MongoDB в качестве репозитория заданий в Spring Batch: https://github.com/spring-projects/spring-batch/issues/877. Когда это будет реализовано, вы сможете хранить как бизнес-данные, так и технические метаданные в одном источнике данных (так что больше нет необходимости в распределенной транзакции), и вы сможете использовать один и тот же MongoTransactionManager как для репозитория заданий, так и для вашего шага.

person Mahmoud Ben Hassine    schedule 02.03.2021
comment
Спасибо, что нашли время, @Mahmoud. У вас есть приблизительная оценка ETA этой функции? Спасибо. - person BlackLog; 03.03.2021
comment
Нет, но мы могли бы рассмотреть его для следующего основного выпуска v5 (для которого мы еще не назначили дату). Но пока что вы сможете достичь того, что ищете, с помощью менеджера транзакций JTA. - person Mahmoud Ben Hassine; 03.03.2021