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 в требуемой транзакции. таким образом:
- Как сделать большие неблокирующие обновления в PostgreSQL?
- Django: как я могу защитить от одновременной модификации записей в базе данных
- EJB 3.0 - Вложенная транзакция! = Требуется Новое?
- Использование транзакций или SaveChanges (false) и AcceptAllChanges ()?
- Откат вложенной / дочерней транзакции
MyName * Required MyName methodB RequiresNew
Теперь позвольте другому методу вызова EJB с вызовом метода EJB. methodA теперь выполняется в транзакции. Будет ли последующий вызов методаB из метода A выполняться в той же транзакции или выполняется в новой транзакции? (ум, это фактический код здесь. Нет явного ejb-вызова метода B)
- Структура Entity Framework и уровень изоляции транзакций
- Как откатить транзакцию базы данных при тестировании служб с помощью Spring в JUnit?
- TransactionScope с файлами в C #
- Что произойдет, если вы не совершаете транзакцию с базой данных (скажем, SQL Server)?
- Firebase runTransaction не работает - MutableData имеет значение null
- Каков уровень изоляции транзакций по умолчанию для SQL Server с ADO.NET?
- javax.transaction.Transactional vs org.springframework.transaction.annotation.Transactional
- Где принадлежит аннотация @Transactional?
Ваш вызов 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
Я думаю, лучшее, что вы можете сделать, это проверить его, чтобы проверить его! 🙂