Понимание транзакции в контексте EJB и Hibernate
EJB по умолчанию обрабатывает управление транзакциями, и, как я читал, hibernate также обрабатывает транзакции. Когда я говорю о транзакции, у меня есть понимание отката операции сохранения базы данных, такой как функциональность.
Мой вопрос заключается в том, как приложение, которое использует как EJB, так и Hibernate, мы выборочно выбираем одного поставщика транзакций для поддержки? Также могут ли одновременно работать транзакции EJB и hibernate?
1 ответ:
Транзакции Hibernate и EJB могут работать и работают одновременно. По умолчанию при выполнении вызова EJB вызов будет находиться в транзакции EJB, которая может быть зафиксирована или откатана. Если вы случайно выполняете вызов hibernate в этом вызове EJB (или в MDB), и эта транзакция откатывается, транзакция базы данных hibernate также откатывается. В этом случае при фиксации транзакции hibernate также зафиксирует транзакцию базы данных.
То, как я думаю это так: транзакция EJB оборачивается вокруг транзакции базы данных Hibernate, и транзакция базы данных зависит от транзакции EJB, которая будет зафиксирована. Если операция не планируется, так и транзакций базы данных. Если транзакция EJB фиксируется, то же самое делает и транзакция базы данных.
Пример #1-успешная транзакция:
EJB method |--> Transaction Started | |--> Call persist method on Entity Manager instance | |--> SQL insert statement added to database transaction ... |--> EJB Transaction committed | --> SQL insert statement committed to database
Пример #2-откат транзакции:
EJB method |--> Transaction Started | |--> Call persist method on Entity Manager instance | |--> SQL insert statement added to database transaction ... X--> EJB Transaction rolls back X --> Database transaction rolls back (insert not performed)
Кроме того, если вы вкладываете вызовы EJB (например, один метод EJB вызывает другой), по умолчанию все они живут в одной транзакции. Таким образом, вся иерархия вызовов должна успешно завершиться, чтобы все вызовы EJB и Hibernate были зафиксированы.
Пример #3-вложенные транзакции EJB:
EJB method |--> Transaction Started | |--> Call persist method on Entity Manager instance |--> SQL insert statement added to database transaction ... |--> Another EJB method called, *continues* same transaction | |--> EJB method successfully commits ... |--> EJB Transaction committed | --> SQL insert statement committed to database
Пример #4-вложенная транзакция EJB с откатом:
EJB method |--> Transaction Started | |--> Call persist method on Entity Manager instance | |--> SQL insert statement added to database transaction ... |--> Another EJB method called, *continues* same transaction | X--> EJB method rolls back ... X--> EJB Transaction rolls back X --> Database transaction rolled back (insert not performed)
Вы можете изменить это поведение, управляя транзакциями самостоятельно или разграничивая свои методы с помощью
@TransactionAttribute
s, Если вы используете управляемые контейнерами транзакции (т. е. контейнер делает тяжелую работу).В этом руководстве содержится много полезной информации о транзакциях и гибернации.