EJB-транзакции в локальных методах-вызовах

В следующей настройке работает ли метод B в (новой) транзакции?

EJB, имеющий два метода, метод A и метод B

public class MyEJB implements SessionBean public void methodA() { doImportantStuff(); methodB(); doMoreImportantStuff(); } public void methodB() { doDatabaseThing(); } } 

EJB управляется контейнером с помощью метода B в require_new transaction и методом A в требуемой транзакции. таким образом:

   MyName * Required   MyName methodB  RequiresNew  

Теперь позвольте другому методу вызова EJB с вызовом метода EJB. methodA теперь выполняется в транзакции. Будет ли последующий вызов методаB из метода A выполняться в той же транзакции или выполняется в новой транзакции? (ум, это фактический код здесь. Нет явного ejb-вызова метода B)

Ваш вызов methodB() является обычным вызовом метода, не перехваченным контейнером EJB; во время выполнения EJB-контейнер вводит прокси-сервер, а не экземпляр вашего classа, так он перехватывает вызовы и настраивает среду перед вызовом вашего метода. Если вы используете this вы вызываете метод напрямую, а не через прокси. Следовательно, оба метода будут использовать одну и ту же транзакцию, независимо от того, что определено в ejb-jar.xml для вызовов через интерфейсы EJB.

вставьте SessionContext и спросите его о своем прокси-экземпляре:

 @Stateless public class UserFacade implements UserFacadeLocal { @Resource private SessionContext context; @Override @TransactionAttribute(TransactionAttributeType.REQUIRED) private void create(User user) { System.out.println("Users Count: "+count()); //invocation#1 System.out.println("Users Count Through Context: "+context.getBusinessObject(UserFacadeLocal.class).count()); //invocation#2 } @Override @TransactionAttribute(TransactionAttributeType.NEVER) public int count() { return ((Long) q.getSingleResult()).intValue(); } } 

в ‘invocation # 1’ это Локальный вызов, не проходящий через прокси, он вернет счет

в ‘invocation # 2’ это вызов через прокси, и, следовательно, вы не комментируете его, чтобы не поддерживать транзакцию, которая теперь открывается методом create (user), этот вызов вызовет исключение транзакции:

javax.ejb.EJBException: EJB нельзя вызвать в глобальной транзакции

Они будут использовать ту же транзакцию.

Если я хорошо помню, транзакция запускается контейнером «до», метод запускается и завершается после его завершения.

Поскольку «a» вызывает «b», «b» будет использовать одну и ту же транзакцию.

: S

Я думаю, лучшее, что вы можете сделать, это проверить его, чтобы проверить его! 🙂

  • Как интегрировать весну с сеансом гибернации и управлением транзакциями?
  • Понимание транзакций Spring. Что происходит, когда транзакционный метод вызывает другой транзакционный метод?
  • TransactionScope автоматически переходит на MSDTC на некоторых машинах?
  • Соответствующий шаблон является строгим, но для элемента 'tx: annotation-driven'
  • Каков «лучший» способ делать распределенные транзакции в нескольких базах данных с использованием Spring и Hibernate
  • Фиксация «Тайм-аут блокировки ожидания превышен; попробуйте перезапустить транзакцию «за« застрявшую »таблицу Mysql?
  • Oracle: как узнать, ожидает ли транзакция?
  • Как использовать TransactionScope в C #?
  • Являются ли функции PostgreSQL транзакционными?
  • Как обойти отсутствие транзакций в MongoDB?
  • Дублирование fragmentов на транзакции fragmentов
  • Давайте будем гением компьютера.