Присоединится ли EntityManager с типом контекста TRANSACTION в Singleton к внешней транзакции, управляемой компонентом? - PullRequest
0 голосов
/ 14 ноября 2018

Предположим, у меня есть бин Singleton с EntityManager в нем. Синглтон также указывает (на уровне метода или класса) атрибут транзакции REQUIRED. Менеджер сущностей получается посредством инъекции @PersistenceContext, которая указывает тип контекста постоянства TRANSACTION. Для всех намерений и целей, если метод в этом синглтоне вызывается с существующей транзакцией, менеджер сущностей должен присоединиться к транзакции или, возможно, предоставить уже существующую, связанную с этой транзакцией через прокси. Если такой метод вызывается вне транзакции, новая транзакция будет запущена на время вызова метода.

Теперь предположим, что у нас есть второй компонент, который использует управляемые компонентом транзакции и внедряет синглтон. Если он явно запускает пользовательскую транзакцию, а затем вызывает метод в синглтоне, присоединится ли менеджер сущностей в этом методе к этой пользовательской транзакции? Будет ли работать переход от контекста, управляемого компонентом, к контексту транзакции, управляемому контейнером? Я знаю, что наоборот не создает барьер.

Класс синглтона:

@Singleton
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class PersistenceSingleton {

    @PersistenceContext(unitName = "test", type = PersistenceContextType.TRANSACTION)
    private EntityManager em;

    public void doStuff() {

        // perform actions with the entity manager that imply changes in the database

    }

}

Компонент с пользовательскими транзакциями (может быть без сохранения состояния или с состоянием):

@Singleton
@TransactionManagement(TransactionManagementType.BEAN)
public class PersistenceFacade {

    @EJB
    private PeristenceSingleton ps;

    @Resource
    private UserTransaction userTx;

    public void doStuff() {
        userTx.begin();
        ps.doStuff();
        userTx.commit();
    }

}

Учитывается ли транзакция, начатая в методе doStuff() из PersistenceFacade, при вызове doStuff() в PersistenceSingleton? Менеджер сущностей автоматически присоединяется к транзакции и ведет себя так, как ожидается от изоляции транзакции во время одновременного доступа?

1 Ответ

0 голосов
/ 14 ноября 2018

UserTransaction используется для изменения демаркации транзакции по умолчанию, но мы все еще контролируем транзакции JTA.

https://www.javacodegeeks.com/2013/03/types-of-entity-managers-application-managed-entitymanager.html говорит:

Если у вас есть UserTransaction, вы можете запуститьразграничение того, что должно быть выполнено в рамках транзакции.Обратите внимание, что вы по-прежнему управляете транзакциями JTA

, поэтому для разграничения UserTransaction будет применяться правило распространения контекста постоянства.

pro JPA В книге сказано:

Когда метод вызывается в менеджере сущностей в области транзакций, он должен сначала посмотреть, существует ли распространенный контекст постоянства.Если таковой существует, менеджер сущностей использует этот контекст постоянства для выполнения операции.Все последующие операции менеджера сущностей в области транзакций, в этом или любом другом компоненте, впоследствии будут использовать этот вновь созданный контекст постоянства.Это поведение работает независимо от того, была ли использована демаркация транзакций, управляемых контейнером или бином.

ответ на ваши вопросы - да (первый вопрос)

Диспетчер сущностей автоматически присоединяется к транзакции и ведет себя так, как ожидается от изоляции транзакции во время одновременного доступа?

Диспетчер сущностей проверяет существование распространенного контекста персистентности и использует его.

...