2010-06-20 2 views
14

Заголовок гласит все: В чем разница между UserTransaction и EntityTransaction?Разница между UserTransaction и EntityTransaction

Моего рудиментарное понимания, что UserTransaction используется, когда JTA требуется (например, делать запросы на Mulitple вещи), и что EntityTransaction используются, когда JPA требуется только (например, когда запрос является атомарным).

Разве это единственное различие между двумя или есть ли для него нечто большее?

+0

возможно дубликат [Что такое различие между @Resource UserTransaction и EntityManager.getTransaction()] (http://stackoverflow.com/questions/2517062/what-is-difference-between-resource-usertransaction-and-entitymanager-gettransac) – ewernli

+1

@ewernli: Это немного несправедливо, я бы Я знаю, что этот вопрос был дубликатом, если я уже знал ответ на этот вопрос в первую очередь! Ни в вопросе, ни в ответе не упоминается «EntityTransaction» - я искал, прежде чем спрашивать. – bguiz

+7

Я полностью понимаю это. Вот почему я нашел время, чтобы ответить на ваш вопрос, насколько мог. Это просто обычная практика SO, чтобы указать возможный дубликат, чтобы люди могли читать ответы на оба вопроса, это улучшает качество SO. Это не критика или что-то еще.Вопрос «закрыт как точный дубликат», только если есть 5 голосов, которые обозначают его как таковые. – ewernli

ответ

20

Мое рудиментарное понимание, что используется UserTransaction когда JTA является требуется (например, делать запросы на Mulitple вещи), и что EntityTransaction используется, когда JPA требуется только (например, когда запрос является атомное).

Это в основном правильно, но ваше описание «нескольких вещей» и «атомных» немного странно. JTA позволяет разработчику использовать распределенную транзакцию для выполнения изменений в мультипликативных ресурсах (база данных, JMS-брокера и т. Д.) Атомарно (все или ничего). Если доступен только один ресурс (например, одна отдельная база данных), вам не нужна JTA, но транзакция по-прежнему является атомной (все или ничего). Это, например, случай, когда вы используете обычную транзакцию JDBC в одной базе данных.

Учитывая UserTransaction vs. EntityTransaction:

  • Если JPA является использование автономных, вы используете EntityTransaction разграничить по сделке самостоятельно.
  • Если JPA используется в управляемой среде, где он интегрируется с JTA, вы используете UserTransaction. EntityManager перехватывает себя в диспетчере распределенных транзакций JTA. Единственная тонкость, о которой я знаю, касается флеша изменений. Когда используется EntityTransaction, JPA знает, что необходимо сбросить изменения. Если транзакция контролируется с использованием UserTransaction, ей необходимо зарегистрировать обратный вызов с использованием JTA registerSynchronization, чтобы изменения были сброшены в базу данных до завершения транзакции. Если вы используете EJB с CMT (транзакция, управляемая контейнером), вам даже не нужно использовать UserTransaction: сервер приложений запускает и останавливает транзакции для вас.

Похожие вопросы:

Смежные вопросы