Управление транзакцией для второго объекта управления при весенней загрузке - PullRequest
0 голосов
/ 08 ноября 2019

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

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

Я намеревался реализовать, как показано ниже, но не уверен, что это правильно или нет.

Мой вопрос:

  1. Может ли реализация, показанная ниже, работать правильно?
  2. Можно ли заменить 2 менеджера сущностей с помощью 2 userTransaction?
  3. Есть ли другой, лучший способ?

Мой пример исходного кода

@Service
@Transactional
class MainService extends BaseServices {
  @PersistenceContext
  private EntityManager entityManagerFirst;

 public void method1(boolean flg) {
  try {
     method2(); // execute with entityManagerFirst
     if (flg) {            
         EntityManager entityManagerSub = getEntityManagerFactory().createEntityManager();
         entityManagerSub.getTransaction().begin();
         // process 1
         method3(entityManagerSub); // do with entityManagerSecond
         // process 2
         method4(); // execute with entityManagerFirst
         // process 3
         boolean result3 = method5(entityManagerSub); // do with entityManagerSecond

         if (result3) {
            entityManagerSecond.getTransaction().commit();
         } else {
            entityManagerSecond.getTransaction().rollback();// need rollback transaction at method3 and method 5
         }
     } else {
         // process 4
         method6(); // execute with entityManagerFirst
         method7(); // execute with entityManagerFirst
    }
   } catch (Exception e) {
      TransactionAspectSupport.currentTransactionStatus()
                .setRollbackOnly(); // set rollback for entityManagerFirst
        entityManagerSecond.getTransaction().rollback(); // rollback for entityManagerSecond
   }
 }

private boolean method3(EntityManager entityManagerSub) {
{
    // execute logic with entityManagerSub
    if (entityManagerSub != null) {
       .... 
       // execute update query with entityManagerSub
        entityManagerSub.executeUpdate();
     }
}
...