Разница между UserTransaction и EntityTransaction - PullRequest
17 голосов
/ 20 июня 2010

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

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

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

1 Ответ

23 голосов
/ 20 июня 2010

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

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

Учитывая UserTransaction против EntityTransaction:

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

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

...