se qualcuno può spiegare cosa fa questa annotazione e quando la usiamo esattamente:
@Transactional(propagation=Propagation.REQUIRED)
Grazie
se qualcuno può spiegare cosa fa questa annotazione e quando la usiamo esattamente:
@Transactional(propagation=Propagation.REQUIRED)
Grazie
Risposte:
Quando l'impostazione di propagazione è PROPAGATION_REQUIRED, viene creato un ambito di transazione logica per ogni metodo su cui viene applicata l'impostazione. Ciascuno di tali ambiti di transazione logica può determinare lo stato di solo rollback individualmente, con un ambito di transazione esterno che è logicamente indipendente dall'ambito di transazione interno. Ovviamente, in caso di comportamento PROPAGATION_REQUIRED standard, tutti questi ambiti verranno mappati sulla stessa transazione fisica. Quindi un marker di solo rollback impostato nell'ambito della transazione interna influisce sulla possibilità della transazione esterna di eseguire effettivamente il commit (come ci si aspetterebbe).
http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html
Se hai bisogno di una spiegazione per laici dell'uso oltre a quella fornita negli Spring Docs
Considera questo codice ...
class Service {
@Transactional(propagation=Propagation.REQUIRED)
public void doSomething() {
// access a database using a DAO
}
}
Quando doSomething () viene chiamato, sa che deve avviare una transazione sul database prima dell'esecuzione. Se il chiamante di questo metodo ha già avviato una transazione, questo metodo utilizzerà la stessa transazione fisica sulla connessione al database corrente.
Questa @Transactional
annotazione fornisce un mezzo per indicare al codice quando viene eseguito che deve avere una transazione. Non funzionerà senza uno, quindi puoi supporre nel tuo codice che non ti rimarranno dati incompleti nel tuo database, o dovrai pulire qualcosa se si verifica un'eccezione.
La gestione delle transazioni è un argomento abbastanza complicato, quindi si spera che questa risposta semplificata sia utile
@Transactional
al tuo livello di servizio, non è necessario aggiungere anche @Transactional
ai metodi DAO chiamati all'interno di quella transazione.
doSomething()
invoca un altro metodo annidato senza @transactional, la stessa transazione verrà applicata anche a quel metodo di invocazione?
Nelle applicazioni Spring, se abiliti il supporto delle transazioni basato sull'annotazione utilizzando <tx:annotation-driven/>
e annota qualsiasi classe / metodo con @Transactional (propagation = Propagation.REQUIRED), il framework Spring avvierà una transazione ed eseguirà il metodo e confermerà la transazione. Se si verifica una RuntimeException, verrà eseguito il rollback della transazione.
In realtà propagation = Propagation.REQUIRED è il livello di propagazione predefinito, non è necessario menzionarlo esplicitamente.
Per ulteriori informazioni: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations
Per comprendere le varie impostazioni e comportamenti transazionali adottati per la gestione delle transazioni, come REQUIRED
, ISOLATION
ecc., Dovrai comprendere le basi della gestione stessa delle transazioni.
Leggi Gestione delle transazioni per ulteriori informazioni.