Понимание транзакции в контексте EJB и Hibernate


EJB по умолчанию обрабатывает управление транзакциями, и, как я читал, hibernate также обрабатывает транзакции. Когда я говорю о транзакции, у меня есть понимание отката операции сохранения базы данных, такой как функциональность.

Мой вопрос заключается в том, как приложение, которое использует как EJB, так и Hibernate, мы выборочно выбираем одного поставщика транзакций для поддержки? Также могут ли одновременно работать транзакции EJB и hibernate?

1 2

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)

Вы можете изменить это поведение, управляя транзакциями самостоятельно или разграничивая свои методы с помощью @TransactionAttributes, Если вы используете управляемые контейнерами транзакции (т. е. контейнер делает тяжелую работу).

В этом руководстве содержится много полезной информации о транзакциях и гибернации.