Атрибуты по умолчанию в транзакциях EJB

Я читаю java ee docs, и я хотел бы задать пару вопросов, чтобы убедиться, что я хорошо понял, что происходит с EJB-Transactions.

1) Документы утверждают, что значение defaalt TransactionManagement равно CONTAINER, а значение по умолчанию TransactionAttribute равно REQUIRED: если это так, я прав, что следующий (сеанс) Bean выполняет все его методы с CONTAINER управляемыми транзакциями и атрибутом REQUIRED?

@Stateless
public class MyBean{

public void methodA(){
...
}

public void methodB(){
...
}

}

2) Состояние документов: Container-managed transactions do not require all methods to be associated with transactions. When developing a bean, you can set the transaction attributes to specify which of the bean’s methods are associated with transactions.

Если я опускаю, однако, TransactionAttributeType, то он автоматически не установлен на REQUIRED? Является ли methodB следующим Bean не связанным с транзакцией?

@Stateless
@TransactionManagement(CONTAINER)
public class MyBean{

@TransactionAttribute(MANDATORY)
public void methodA(){
...
}

public void methodB(){
...
}

}

Ответ 1

  • Да, CONTAINER и REQUIRED по умолчанию.

  • Цитата, которую вы дали, похоже, получена из Учебника Java EE 5. Я согласен, что предложение несколько смутно сформулировано. Здесь возможно переписывание, которое могло бы помочь.

Операции, управляемые контейнером, не требуют, чтобы все методы использовали по умолчанию ТРЕБУЕМАЯ семантика транзакции. При разработке bean вы может изменить семантику транзакции, установив транзакцию атрибутов. Например, вы можете указать, что метод должен выполняться без каких-либо транзакций, используя атрибут транзакции NEVER,

Ответ 2

  • Да
  • По умолчанию используется метод ТРЕБУЕТСЯ. Поэтому метод B() НЕОБХОДИЛ

Ответ 3

1- Да.

2- methodB() имеет атрибут REQUIRED, так как он является атрибутом по умолчанию, но вы можете переопределить этот атрибут по умолчанию с любыми другими параметрами, такими как (NEVER, REQUIRED_NEW, SUPPORTED... и т.д.).

Однако у контейнера все еще есть элемент управления для отката вашей транзакции в случае системного исключения, но у вас все еще есть возможность откатить ваши транзакции, вызвав метод setRollbackOnly.

Существует два способа откатить транзакцию, управляемую контейнером. Во-первых, если выдается системное исключение, контейнер автоматически откатит транзакцию. Во-вторых, вызывая метод setRollbackOnly интерфейса EJBContext, метод бина инструктирует контейнер откатить транзакцию. Если бин генерирует исключение приложения, откат не является автоматическим, но может быть инициирован вызовом setRollbackOnly.

https://docs.oracle.com/cd/E19798-01/821-1841/bnciv/index.html