Мне нужно реализовать 2 процесса с 2 диспетчером сущностей и хочу вручную управлять транзакцией для второго менеджера сущностей, потому что это может быть откат или фиксация на основе логики.
Поскольку их процессы чередуются, поэтому я не могу переместить их процессы в один открытый метод и использовать для него новую транзакцию.
Я намеревался реализовать, как показано ниже, но не уверен, что это правильно или нет.
Мой вопрос:
- Может ли реализация, показанная ниже, работать правильно?
- Можно ли заменить 2 менеджера сущностей с помощью 2 userTransaction?
- Есть ли другой, лучший способ?
Мой пример исходного кода
@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();
}
}