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



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



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



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



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



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



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



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



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

484   1  

1 ответ:

Spring batch использует ядро Springуправление транзакциями , причем большая часть семантики транзакций расположена вокруг фрагмента элементов, как описано в разделе 5.1документации Spring Batch .

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

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

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

Comments

    Ничего не найдено.