Лучший способ управлять транзакциями

У меня есть система на основе JBoss и Hibernate. И мне нужно обработать две долгие операции. Операции могут быть, вероятно, длиннее, чем время ожидания транзакции. Его операции сохраняются во многих-многих сущностях в двух разных транзакциях. И если что-то пойдет не так, во время этой операции я должен откатить все изменения транзакций.

Каков наилучший способ решить эту проблему?

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

Является ли управление многими транзакциями лучше в этой ситуации. И как я могу это сделать?


person Max    schedule 15.09.2009    source источник
comment
Сколько времени займет одна транзакция?   -  person APC    schedule 15.09.2009
comment
Да, нам нужно знать, что ты имеешь в виду под длинным. 5 минут, или это как бронирование отеля, где это может занять 24 часа? Действительно длинные транзакции (например, гостиничный номер) обычно выполняются с использованием компенсации, а не с использованием встроенной обработки транзакций БД.   -  person SteveD    schedule 15.09.2009


Ответы (3)


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

транзакции XA позволяют выполнять множество небольших операций и фиксировать или откатывать их одним ударом. Попробуйте поискать в Google «транзакции hibernate xa». Большинство современных СУБД (MySQL 5.x, PostgreSQL, SQL Server, Oracle, DB2, Sybase и т. д.) поддерживают транзакции XA.

person ConcernedOfTunbridgeWells    schedule 15.09.2009

Использование одной транзакции хорошо, надежно и так далее. Попробуйте еще раз убедить администратора ;-)


В противном случае я могу думать о:

  • использование более коротких транзакций для вставки меньшего количества строк, использование маркера для обозначения "незавершенного". Это может быть в существующем столбце или в новом (может быть, в другой таблице?).
  • если какая-либо транзакция откатится, попробуйте еще раз; если вы предпочитаете прервать всю операцию, вы можете удалить строки с маркером «incomplete».
  • когда все транзакции зафиксированы, вы можете открыть последнюю транзакцию, просто пометив все строки как "завершенные" (например: update ... where ...). Это должно быть намного быстрее, чем полная вставка, поэтому транзакция должна быть достаточно короткой.
person KLE    schedule 15.09.2009
comment
Спасибо, хорошая идея. Но я боюсь, что добавлять маркеры к нашим сущностям нехорошо. Может в Hibernate есть нативные маркеры? А разметка это долгая операция, у нас много строк ) - person Max; 15.09.2009

Мне пришлось сделать что-то подобное в JPA (через спящий режим). Я выполнил операцию в N транзакциях, а не в 1 большой транзакции. Эта операция выполнялась редко — это была автоматизированная работа, поэтому пользователь не ждал результата на веб-странице.

Как долго вы ожидаете, что транзакция займет? Как долго вы ожидаете, что пользователь будет ждать?? Как часто вы ожидаете, что эта операция будет выполняться. Может быть, вы требования не ясны.

person Conor    schedule 15.09.2009