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