Каково влияние явного запуска и фиксации транзакции, когда тип транзакции — JTA?

Я работаю над приложением J2EE, которое будет развернуто на Weblogic, оно содержит два слоя:

  1. Бизнес: DAO и логические методы
  2. EJB: который будет использовать бизнес-уровень

Я разделяю два уровня, чтобы иметь возможность повторно использовать бизнес-уровень (как jar-библиотеку) в проекте Java SE.

Я использую transaction-type = JTA, чтобы позволить серверу управлять транзакциями, но в проекте SE я использую transaction-type = RESOURCE_LOCAL, поэтому мне нужно явно начать и зафиксировать транзакцию.

Итак, вопрос: есть ли какие-либо проблемы, если я запускаю и фиксирую транзакцию явно при использовании JTA?

Другими словами, есть ли огромные различия между двумя приведенными ниже кодами:

public void create(T entity) {

    entityManager.persist(entity);

}

а также

public void create(T entity) {

    entityManager.getTransaction().begin(); 
    entityManager.persist(entity);
    entityManager.getTransaction().commit();

}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

      try {
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        try {
            entityManager.persist(entity);
            transaction.commit();
        } catch (Exception e) {                
            transaction.rollback(); 
            throw e; // optional if you want to manage the exception higher up                         
        } finally {
          entityManager.close(); // optional if you also manage you EM creation manually.
         } 

спасибо за ваш ответ, так что это не вызовет негативных последствий потери некоторых преимуществ при использовании transaction-type = JTA

user771221 08.04.2019 09:52

ваши транзакции будут иметь те же реквизиты конфигурации, что и CMT. Вам просто нужно управлять исключениями начала/конца/обработки.

Maciej Kowalski 08.04.2019 10:01

Другие вопросы по теме