2010-11-07 3 views
16

У меня есть лица без боба с управляемым компонентом транзакциями, а также способ, как это:Как распространяется UserTransaction?

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

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

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

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

     ... 
     ut.commit(); 

    } 

} 

Так как же UserTransaction размножить в OtherStatelessBeanLocal фасоли?

+0

хорошо это не так, правильно? –

ответ

32

Объект 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, как правило, реализует (прямо или косвенно) как интерфейсы , так и TransactionSynchronizationRegistry. Между этими двумя интерфейсами в контейнере есть все крючки, необходимые для отслеживания DataSource s, EntityManager и других ресурсов в текущей транзакции от вашего имени. Эти интерфейсы также позволяют контейнеру предлагать обратные вызовы, такие как SessionSynchronization, а также средства для выполнения других действий от вашего имени после завершения транзакции, такие как очистка/закрытие EntityManager, отправка ожидающих сообщений JMS и сохранение любых таймеров, созданных вашим приложением в курсе сделки.

+2

Идеальный ответ.+1 –

+0

На самом деле нет, потому что он не применяет знания к заданному вопросу. – Thomas

0

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

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

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

ДИЗКН для типа транзакции здесь: http://download.oracle.com/javaee/6/api/javax/ejb/TransactionAttributeType.html

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

+0

Обратите внимание, что в случае расширенного контекста постоянства контекст персистентности по-прежнему исключительно связан с транзакцией и недоступен для других транзакций, поскольку, как только объект @Stateful будет вовлечен в транзакцию, не разрешается покидать транзакция, пока она не совершит или откатится. Все запросы этого компонента @Stateful извне транзакции будут ждать длительности @AccessTimeout, прежде чем, наконец, бросить какую-то форму ConcurrentAccessException. –

4

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