Как Spring Batch управляет транзакциями (возможно, с несколькими источниками данных)?

Мне нужна некоторая информация о потоке данных в пакетной обработке Spring, но не найти то, что я ищу в Интернете (несмотря на несколько полезных вопросов на этом сайте).

Я пытаюсь установить стандарты для использования Spring Batch в нашей компании, и нам интересно, как Spring Batch ведет себя, когда несколько процессоров на шаге обновляют данные в разных источниках данных.

Этот вопрос фокусируется на фрагментированном процессе, но не стесняется предоставлять информацию о других режимах.

Из того, что я видел (пожалуйста, поправьте меня, если я ошибаюсь), когда строка читается, она следует всему потоку (читателю, процессорам, записи) до следующего чтения (в отличие от силосной обработки, где читатель будет обрабатывать все строки, отправлять их на процессор и т.д.).

В моем случае несколько процессоров считывают данные (в разных базах данных) и обновляют их в процессе, и, наконец, писатель вставляет данные в еще один БД. Пока что JobRepository не связан с базой данных, но это будет независимым, что еще более усложняет задачу.

Эта модель не может быть изменена, поскольку данные принадлежат нескольким бизнес-областям.

Как обрабатывается транзакция в этом случае? Являются ли данные переданы только после обработки полного фрагмента? И тогда есть ли 2-фазное управление фиксацией? Как это обеспечивается? Какую разработку или конфигурацию необходимо сделать для обеспечения согласованности данных?

В более общем плане, , какими будут ваши рекомендации в подобном случае?

Ответ 1

Spring пакет использует Spring core управление транзакциями, причем большая часть семантики транзакций размещается вокруг части элементов, как описано в разделе 5.1 из Spring пакетных документов.

Поведение транзакций читателей и писателей зависит от того, что они собой представляют (например, файловая система, база данных, JMS-очередь и т.д.), но если ресурс настроен для поддержки транзакций, то они автоматически зачисляются на Spring. То же самое касается XA - если вы сделаете конечную точку ресурса совместимой с XA, тогда она будет использовать для этого 2 фазовых фиксации.

Возвращаясь к транзакции chunk, он установит транзакцию на основе фрагментов, поэтому, если вы установите интервал фиксации на 5 в заданном таске, тогда он откроет и закроет новую транзакцию (включающую все ресурсы, управляемые диспетчер транзакций) для заданного количества чтений (определяемых как интервал фиксации).

Но все это настроено вокруг чтения из одного источника данных, соответствует ли это требованиям? Я не уверен, что Spring пакет может управлять транзакцией, где он считывает данные из нескольких источников и записывает результат процессора в другую базу данных в рамках одной транзакции. (На самом деле я не могу придумать ничего, что могло бы это сделать...)