Объект 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 и сохранение любых таймеров, созданных вашим приложением в курсе сделки.
хорошо это не так, правильно? –