@Transactional (propagazione = Propagation.REQUIRED)


Risposte:


65

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).

inserisci qui la descrizione dell'immagine

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html


166

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 @Transactionalannotazione 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



se utilizza la configurazione basata su proxy per dichiarare e accedere al livello DAO, anche il metodo nella classe DAO deve essere annotato con @Transactional.
Kurapika

Se hai aggiunto @Transactionalal tuo livello di servizio, non è necessario aggiungere anche @Transactionalai metodi DAO chiamati all'interno di quella transazione.
Brad

se doSomething()invoca un altro metodo annidato senza @transactional, la stessa transazione verrà applicata anche a quel metodo di invocazione?
thisarattr

Sì, fintanto che lo stesso Thread viene utilizzato per eseguire un metodo annidato (cioè non si crea un nuovo Thread esplicitamente). Questo perché le transazioni Spring sono vincolate al thread corrente utilizzando le variabili ThreadLocal
Brad

15

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


5

Per comprendere le varie impostazioni e comportamenti transazionali adottati per la gestione delle transazioni, come REQUIRED, ISOLATIONecc., Dovrai comprendere le basi della gestione stessa delle transazioni.

Leggi Gestione delle transazioni per ulteriori informazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.