Zagnieżdżone transakcje JPA i blokowanie
Rozważmy scenariusz, w którym istnieją dwie metody w różnych bezstanowych komponentach bean
public class Bean_A {
Bean_B beanB; // Injected or whatever
public void methodA() {
Entity e1 = // get from db
e1.setName("Blah");
entityManager.persist(e1);
int age = beanB.methodB();
}
}
public class Bean_B {
//Note transaction
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void methodB() {
// complex calc to calculate age
}
}
Transakcja rozpoczęta przez BeanA.methodA zostanie zawieszona, a nowa transakcja zostanie uruchomiona w BeanB.methodB. Co zrobić, jeśli methodB musi uzyskać dostęp do tego samego obiektu, który został zmodyfikowany przez metodę A. Spowodowałoby to zakleszczenie. Czy można temu zapobiec bez polegania na poziomach izolacji?