Подтвердить что ты не робот

Как распространяется UserTransaction?

У меня есть безстоящий bean с bean -управляемыми транзакциями и метод вроде этого:

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class ... {

    @Resource 
    private UserTransaction ut;
    @EJB 
    private OtherStatelessBeanLocal other;

    public void invokeSomeMethods() 
        ut.begin();
        ...

        // invoke other bean methods here.
        other.method();

        ...
        ut.commit();

    }

}

Итак, как UserTransaction распространяется на OtherStatelessBeanLocal bean?

4b9b3361

Ответ 1

Объект UserTransaction - это объект, предоставленный контейнером, который обертывает доступ к вызовам API, которые контейнер использует внутри, в частности javax.transaction.TransactionManager. TransactionManager имеет такие методы, как begin, commit, rollback и javax.transaction.Transaction getTransaction()

Под обложками TransactionManager будет использовать ThreadLocal или подобный метод для отслеживания текущего состояния транзакции с потоком. ThreadLocals - очень простые объекты, которые можно легко описать как static HashMap, который использует имя потока как ключ и объект по вашему выбору в качестве значения. Пока вы остаетесь в одном и том же потоке, вы можете получить объект из любой точки в цепочке вызовов. Это одна из причин, по которым не разрешено запускать потоки в среде Java EE.

Распространение безопасности работает аналогичным образом, как и поисковые запросы JNDI, которые магически указывают на правильное пространство имен модулей или компонентов java:comp/env. В нижней строке вы не можете реализовать сервер приложений без ThreadLocals. Пропаганда звучит более активно, чем есть, когда на самом деле это просто акт не покидания нити, поэтому контейнер и все задействованные все еще могут найти ваш "материал".

В терминах управления транзакциями объект, который TransactionManager будет отслеживать в своем ThreadLocal, обычно реализует (прямо или косвенно) как Transaction, так и TransactionSynchronizationRegistry. Между этими двумя интерфейсами контейнер имеет все необходимые для отслеживания DataSource s, EntityManager и другие ресурсы в текущей транзакции от вашего имени. Эти интерфейсы также позволяют контейнеру предлагать обратные вызовы, такие как SessionSynchronization, а также средства для выполнения других действий от вашего имени после завершения транзакции, такие как очистка/закрытие EntityManagers, отправка ожидающих сообщений JMS и сохранение любых таймеров, созданных вашим приложением в ходе транзакции.

Ответ 2

Исходя из спецификации EJB, вы не можете передать контекст транзакции из bean (в данном случае ваш основной класс...), используя программную транзакцию в другой bean (в данном случае другой), используя программную транзакцию

Ответ 3

Для EJB3 вы обычно определяете распространение транзакций с помощью аннотации @TransactionAttribute.

Атрибут транзакции по умолчанию для всех приложений EJB 3.0 ТРЕБУЕТСЯ:

Если клиент вызывает метод bean предприятия, когда клиент связан с контекстом транзакции, контейнер вызывает метод bean предприятия в контексте транзакции клиента.

Документ для типа транзакции находится здесь: http://download.oracle.com/javaee/6/api/javax/ejb/TransactionAttributeType.html

N.B. Контрастность и распространение транзакций обычно происходят вместе, но не всегда - будьте осторожны. Например, сеанс с состоянием beans может иметь расширенный контекст сохранения .