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?

È stato utile?

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.

Primavera doc

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top