Come gestire 2 metodi DAO in una singola transazione?

12

In un'intervista qualcuno mi ha chiesto: come gestiamo 2 metodi transazionali / dao in un'unica transazione. Funzionalità desiderate:

  1. Se qualcuno non funziona, è necessario eseguire il rollback di entrambi i metodi.
  2. Entrambi i metodi possono essere chiamati separatamente collegati con una singola transazione.
  3. La gestione deve essere su livello DAO, non sul livello di servizio.

Penso: la domanda si riferisce alla gestione delle transazioni primaverili.

    
posta Satish Pandey 04.09.2012 - 08:12
fonte

3 risposte

12

Prima di tutto, la gestione delle transazioni dovrebbe essere eseguita sul livello di servizio, non sul livello DAO, poiché ciò comporterebbe un notevole sovraccarico delle prestazioni (per gestire il livello di isolamento della transazione e la propagazione appropriati a ciascun metodo diverso). Inoltre, l'ambito di una unità di lavoro viene dal livello di servizio anziché dal livello di accesso ai dati: immagina di eseguire un processo aziendale che deve occuparsi di 2 o più DAO.

C'è molta discussione in Internet che punta in quella direzione come qui , qui e here .

Comunque, dal momento che è un'intervista, accettiamo la domanda così com'è. Dal mio punto di vista, usereste l'annotazione @Transactional (o la configurazione XML) in entrambi i metodi e con una propagazione della transazione con valore REQUIRED . In questo modo, quando uno di questi metodi viene richiamato e se non esiste alcuna transazione precedente, verrà creata una nuova transazione:

@Transactional
class MyDAO {

   @Transactional(propagation = REQUIRED)
   public void foo() {
   }

   @Transactional(propagation = REQUIRED)
   public void bar() {
   }

}
    
risposta data 04.09.2012 - 12:24
fonte
2

Ignorare la molla e le strutture nella mia risposta ..... solo l'idea di base dell'uso dei parametri di funzione. Sono sicuro che il concetto potrebbe applicarsi all'interno di [inserire framework qui].

Dovresti gestire il commit / rollback al di fuori dei 2 metodi DAO. I 2 metodi dovrebbero prendere la transazione / connessione come input.

codice psuedo:

bool method1(Tran t) { /* stuff */}
bool method2(Tran t) { /* stuff */ }

callingMethod() {
     Tran t = null;
     try {
         t = new Conn().open().startTran();
         if(method1(t) && method2(t))
             t.commit();
         else
             t.rollBaack();
     }
     catch(ex) {  t.rollBack();  }
     finally {  t.closeConn();  }
}
    
risposta data 04.09.2012 - 16:08
fonte
0

Esiste la possibilità che due metodi possano funzionare indipendentemente anche nello stesso momento in cui potrebbero essere eseguiti in una stessa transazione. Quindi dobbiamo usare Propagation-Required. Se la transazione deve essere eseguita nella stessa transazione, utilizzerà la prima transazione, altrimenti verrà creata una nuova transazione se invocata in modo indipendente. Correggimi se sbaglio.

    
risposta data 18.03.2016 - 15:42
fonte

Leggi altre domande sui tag