Могу ли я продолжить транзакцию базы данных после неудачной вставки?

Наше приложение очень параллельное. Он берет данные MQ и сохраняет их в базе данных. Существует несколько сообщений, которые могут содержать одни и те же данные. Таким образом, одно сообщение может содержать часы работы, а второе сообщение может содержать часы работы и местоположение.

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

В настоящее время сообщение получает одну транзакцию (Propagation.REQUIRED) (с использованием Spring и Hibernate). Я делаю сброс после каждого типа вставки данных. Поэтому я сохраняю данные о местоположении и делаю сброс. затем я сохраняю часы работы и смываю.

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

Я просматривал Propagation.REQUIRES_NEW, но у меня возникли проблемы. Кроме того, меня беспокоит замедление этого процесса. Мне нужно было бы 3 транзакции (перед всем этим есть немного логики.)

Большая часть информации о том, что мы говорим об откатах, но я не хочу откатывать. Я просто хочу двигаться дальше. Могу я?


person markthegrea    schedule 30.11.2012    source источник
comment
это звучит как работа для старого доброго JDBC, если вам действительно нужно сделать это с Hibernate, может быть, сеанс без сохранения состояния?   -  person Affe    schedule 30.11.2012


Ответы (1)


Нет, вы не можете поймать исключение и попытаться продолжить. Вот что написано в главе об обработке исключений документация по спящему режиму говорит:

Если сеанс генерирует исключение, включая любое исключение SQLException, немедленно откатите транзакцию базы данных, вызовите Session.close() и отбросьте экземпляр сеанса. Некоторые методы сеанса не оставляют сеанс в согласованном состоянии. Ни одно исключение, созданное Hibernate, не может рассматриваться как восстанавливаемое.

person JB Nizet    schedule 30.11.2012