Primavera @Transactional metodo - la partecipazione di transazione
-
30-09-2019 - |
Domanda
in una dao ho 2 metodi @Transactional.
se non fornisco alcuna proprietà esplicite,
allora che cosa succederà, se
ho eseguito un metodo nel corpo di un altro?
Entrambi i metodi verrà eseguito all'interno dello stesso una transazione?
Soluzione
Proxy nella primavera AOP
Quando si utilizza transazionale, hai a che fare con i proxy di classi, quindi in questo scenario:
@Transactional
public void doSomeThing(){ // calling this method targets a proxy
doSomeThingElse(); // this method targets the actual class, not the PROXY,
// so the transactional annotation has no effect
}
@Transactional
public void doSomeThingElse(){
}
si sta chiamando il proxy dall'esterno, ma la seconda chiamata al metodo è realizzato all'interno del dell'oggetto proxy e per questo non ha il supporto transazionale. Così, naturalmente, corrono nella stessa transazione, non importa ciò che i valori della annotazioni @Transactional nel secondo metodo sono
quindi se avete bisogno operazioni distinte, è necessario chiamare
yourservice.doSomething();
yourservice.doSomethingElse();
dall'esterno.
L'intero scenario è spiegato molto bene nel capitolo Spring AOP> AOP intesa deleghe , tra cui questa "soluzione":
Accesso all'oggetto corrente AOP Proxy dall'interno
public class SimplePojo implements Pojo {
public void foo() {
// this works, but... gah!
((Pojo) AopContext.currentProxy()).bar();
}
public void bar() {
// some logic...
}
}
Altri suggerimenti
Il valore predefinito dell'attributo propagation
di @Transactional
IS REQUIRED
, il che significa:
Sostenere una transazione corrente, crearne uno nuovo se non esiste.
Quindi sì -. Entrambi i metodi verranno eseguiti nella stessa transazione
Ma un consiglio importante: non rendere il vostro DAO transazionale . I servizi dovrebbero essere transazionale, non il DAO.
Una nota:
In modalità proxy (che è il default), solo metodo esterno chiamate in arrivo attraverso il proxy vengono intercettate. Questo significa che l'auto-invocazione, in effetto, un metodo nel bersaglio opporsi a chiamare un altro metodo oggetto di destinazione, non porterà ad un transazione reale in fase di esecuzione, anche se il metodo richiamato è contrassegnata con @Transactional.