У меня есть система на основе JBoss и Hibernate. И мне нужно обработать две долгие операции. Операции могут быть, вероятно, длиннее, чем время ожидания транзакции. Его операции сохраняются во многих-многих сущностях в двух разных транзакциях. И если что-то пойдет не так, во время этой операции я должен откатить все изменения транзакций.
Каков наилучший способ решить эту проблему?
Я думаю, что лучше всего объединить все операции в одну транзакцию, но это требует установки LOng timeout транзакции, что неприемлемо для нашей системы.
Является ли управление многими транзакциями лучше в этой ситуации. И как я могу это сделать?
Ответ 1 · рейтинг 2 · ConcernedOfTunbridgeWells
Можете ли вы использовать сервер JTA (координатор транзакций) для выполнения транзакции в несколько этапов с транзакциями XA? Это сообщение немного фанатично. на пару с открытым исходным кодом, которые могут работать для вас.
транзакции XA позволяют выполнять множество небольших операций и фиксировать или откатывать их одним ударом. Попробуйте поискать в Google "транзакции hibernate xa". Большинство современных СУБД (MySQL 5.x, PostgreSQL, SQL Server, Oracle, DB2, Sybase и т. д.) поддерживают транзакции XA.
Ответ 2 · рейтинг 1 · KLE
Использование одной транзакции хорошо, надежно и так далее. Попробуйте еще раз убедить администратора ;-)
В противном случае я могу думать о:
- использование более коротких транзакций для вставки меньшего количества строк, использование маркера для обозначения "незавершенного". Это может быть в существующем столбце или в новом (может быть, в другой таблице?).
- если какая-либо транзакция откатится, попробуйте еще раз; если вы предпочитаете прервать всю операцию, вы можете удалить строки с маркером "incomplete".
- когда все транзакции зафиксированы, вы можете открыть последнюю транзакцию, просто пометив все строки как "завершенные" (например:
update ... where ...). Это должно быть намного быстрее, чем полная вставка, поэтому транзакция должна быть достаточно короткой.
Ответ 3 · Conor
Мне пришлось сделать что-то подобное в JPA (через спящий режим). Я выполнил операцию в N транзакциях, а не в 1 большой транзакции. Эта операция выполнялась редко - это была автоматизированная работа, поэтому пользователь не ждал результата на веб-странице.
Как долго вы ожидаете, что транзакция займет? Как долго вы ожидаете, что пользователь будет ждать?? Как часто вы ожидаете, что эта операция будет выполняться. Может быть, вы требования не ясны.