abbiamo:Partendo nuova transazione in primavera fagioli
@Transactional(propagation = Propagation.REQUIRED)
public class MyClass implementes MyInterface { ...
MyInterface ha un solo metodo: go()
.
Quando go() viene eseguito, viene avviata una nuova transazione che esegue il commit/rollback quando il metodo è completo - questo va bene.
Ora diciamo in go() chiamiamo un metodo privato in MyClass che ha @Transactional(propagation = Propagation.REQUIRES_NEW
. Sembra che Spring "ignori" l'annotazione REQUIRES_NEW e non avvii una nuova transazione. Credo che questo sia dovuto al fatto che Spring AOP opera a livello di interfaccia (MyInterface) e non intercetta alcuna chiamata ai metodi MyClass. È corretto?
C'è un modo per avviare una nuova transazione all'interno della transazione go()? È l'unico modo per chiamare un altro bean gestito Spring che ha transazioni configurate come REQUIRES_NEW?
Aggiornamento: Aggiungendo che quando i client eseguono go()
lo fanno tramite un riferimento all'interfaccia, non la classe:
@Autowired
MyInterface impl;
impl.go();
Ma anche se '@ Transactional' è su un metodo pubblico di MyClass, sembra ancora che Spring non lo rilevi ** a meno che ** il metodo sia definito nell'interfaccia - corretto? –
Per aggiungere, questo è perché il client che sta eseguendo il metodo go() in questione ha un riferimento all'interfaccia, non alla classe. –
@Marcus: Sort of. Se 'MyClass' implementa un'interfaccia, Spring utilizzerà solo quell'interfaccia per generare il proxy transazionale e ignorerà anche i metodi pubblici non di interfaccia. Tuttavia, se 'MyClass' non implementa alcuna interfaccia, verranno utilizzati tutti i metodi pubblici. – skaffman