Наше приложение очень параллельное. Он берет данные MQ и сохраняет их в базе данных. Существует несколько сообщений, которые могут содержать одни и те же данные. Таким образом, одно сообщение может содержать часы работы, а второе сообщение может содержать часы работы и местоположение.
Итак, приходит первое сообщение, и я сохраняю данные о часах работы. Затем приходит вторая транзакция с точно такими же данными по часам работы. Теперь мне нужно, чтобы данные о местоположении сохранялись, но часы работы дублируются. Я не могу проверить часы работы в базе данных из-за параллелизма (если я проверю, может быть, что он не существует, тогда к тому времени, когда я его сохраню, он мог быть вставлен другим потоком). Я тоже хочу быть быстрым. (много нагрузки на этот загрузчик.)
В настоящее время сообщение получает одну транзакцию (Propagation.REQUIRED) (с использованием Spring и Hibernate). Я делаю сброс после каждого типа вставки данных. Поэтому я сохраняю данные о местоположении и делаю сброс. затем я сохраняю часы работы и смываю.
Если я просто поймаю сообщение об ошибке (оно выдается после сброса()) и съем его, будут ли сохранены другие сохраненные данные (данные о местоположении)? Можно ли использовать транзакцию после сбоя вставки в базу данных? Поэтому, если первое сохранение не удалось, я хочу, чтобы вторая вставка работала.
Я просматривал Propagation.REQUIRES_NEW, но у меня возникли проблемы. Кроме того, меня беспокоит замедление этого процесса. Мне нужно было бы 3 транзакции (перед всем этим есть немного логики.)
Большая часть информации о том, что мы говорим об откатах, но я не хочу откатывать. Я просто хочу двигаться дальше. Могу я?