Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: MaxОтветов: 3

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

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

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

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

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

javahibernatetransactionsjbossjta

Ответы

Ответ 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 большой транзакции. Эта операция выполнялась редко - это была автоматизированная работа, поэтому пользователь не ждал результата на веб-странице.

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы