как концепция транзакций реализована в EJB - PullRequest
7 голосов
/ 23 сентября 2010

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

Ответы [ 5 ]

8 голосов
/ 23 сентября 2010

Hibernate не реализует транзакции, он полагается и переносит транзакции JDBC или транзакции JTA (управляемые контейнером или приложением).

Что касается EJB, если вы хотите понять детали JTA Transaction Manager, вам нужно свободно владеть интерфейсами JTA UserTransaction, TransactionManager и XAResource, которые описаны в Спецификация JTA . Учебник и справочник по JDBC API, третье издание также будет полезен для понимания XA-части драйвера JDBC.

Затем получите источники контейнера EJB (например, JBoss) или автономного менеджера транзакций JTA (например, Atomikos) для анализа части TM. И удачи.

4 голосов
/ 03 октября 2010

Этот вопрос может иметь ответы на многих уровнях.

Общее обсуждение того, что происходит, можно найти здесь

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

someobject.BeginTransaction()

.Фактический API, используемый EJB-контейнером: JTA .EJB-компоненты могут фактически использовать транзакцию, управляемую компонентом Bean, или транзакции, управляемые контейнером.В случае Bean Managed исполнитель должен выполнять вызовы JTA.Чаще всего мы используем транзакции, управляемые контейнером (CMT).В этом случае контейнер имеет логику, которая запускается до достижения реализации.Например:

if ( we're not already in a transaction )
    begin transaction

call the EJB implementation

и позже у контейнера есть логика

if ( finished processing request )
    commit transaction

с другими путями для прерывания транзакции в случае возникновения ошибок.

Теперь эта логика болеесложный, потому что CMT EJBs аннотированы с помощью операторов управления транзакциями.Например, вы можете сказать «если у нас уже есть транзакция, используйте ее». Поэтому, если один EJB вызывает другую, используется только одна транзакция.Для этого ознакомьтесь со спецификацией EJB.

Однако все это довольно очевидно в любой статье EJB Java EE.Поэтому я подозреваю, что вы спрашиваете меня о том, что происходит внутри вызовов JTA, как реализован менеджер транзакций и его связь с менеджерами транзакционных ресурсов (например, Базы данных).Это огромная тема.На самом деле вы приступили к реализации протокола распределенных транзакций XA .Честно говоря, я сомневаюсь, что вам действительно нужно это знать.В какой-то момент вы доверяете используемым API.Однако есть одна ключевая деталь: ваш менеджер транзакций (как правило, сам сервер приложений) должен иметь возможность сообщать менеджерам ресурсов RE о судьбе любой данной транзакции, и эта информация должна сохраняться после перезапуска сервера приложений, следовательно, некоторое постоянное хранилище информации о транзакцияхдолжен быть сохранен.Где-то вы найдете журналы транзакций, и при настройке сервера приложений вам нужно убедиться, что эти журналы хорошо сохраняются.

1 голос
/ 29 сентября 2010

С EJB в действии книга

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

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

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

  1. Менеджер транзакций запрашивает базу данных 1, может ли она зафиксировать текущую транзакцию
  2. Если так, спросите базу данных 2, может ли она совершить текущую транзакцию
  3. Менеджер транзакций просит базу данных 1 зафиксировать
  4. Менеджер транзакций просит базу данных 2 зафиксировать

Hibernate построен на основе API JDBC . Он просто координирует одну базу данных. Так что если вы позвоните

session.commit();

За кулисами это называется

connection.commit();

Если вы действительно хотите изучать внутренности транзакций, мой совет: Java Transaction Processing book.

0 голосов
/ 03 октября 2010
0 голосов
/ 23 сентября 2010

Hibernate имеет TransactionFactory:

Абстрактная фабрика для экземпляров транзакций. Конкретные реализации определяются hibernate.transaction.factory_class.

Имеет реализации: JDBCTransactionFactory, JTATransactionFactory, CMTTransactionFactory. Эти фабрики создают экземпляр Transaction - например, JDBCTransaction.

Тогда я не могу сказать вам, что происходит с JTA и CMT, но для JDBC это так же просто, как установить автоматическую фиксацию в false (когда вы вызываете начать транзакцию):

connection.setAutoCommit(false);

И соответственно на transaction.commit(): connection.commit()

Если при работе с сеансом возникает какое-либо исключение, оно вызывает connection.rollback()

...