Domanda

I Documenti di primavera fanno aFantastico lavoro di descrivere le proprietà di propagazione transazionali.

Tuttavia, mi stavo chiedendo se ci sono dei ben noti esempi del mondo reale disponibili che descrivono ciascuna di queste proprietà più accuratamente nei termini del layman?

È stato utile?

Soluzione

propagation_required

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}
.

Quando Dosomething () viene chiamato inizierà una nuova transazione se il chiamante non ha già avviato una transazione .

Se il chiamante di questo metodo ha già avviato una transazione, viene utilizzata la transazione dei chiamanti e non viene creata alcuna nuova transazione (cioè c'è una transazione in gioco).

Se un'eccezione viene lanciata all'interno di Dosomething (), verrà eseguito il rotolato indietro, il che significa che il chiamante vedrà anche la transazione laminata indietro.

Quando Dosomething () restituisce la transazione non sarà ancora stata impegnata. È il chiamante che commetterà la transazione (o possibilmente arrotolato).

propagazione_requires_new

class Service {
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void doSomething() {
        // access a database using a DAO
    }
}
.

Quando Dosomething () è chiamato IT SEMPRE Avvia una nuova transazione.

Se il chiamante di questo metodo ha già avviato una transazione (TXNouter), quindi la transazione dei chiamanti è sospesa e viene creata una nuova transazione (TXNinner) (cioè ci sono due transazioni in gioco).

Se un'eccezione viene lanciata all'interno di Dosomething (), TXNinner verrà tornato indietro, ma la transazione "sospesa" dal chiamante (TXNouter) non è influenzata.

Quando Dosomething () restituisce senza eccezioni, commettere la transazione (txninner). La transazione del chiamante (TXNouter) sarà ripresa e non è a conoscenza del fatto che un'altra transazione sia stata impegnata. Il chiamante può quindi commettere o roll back txnouter mentre vede in forma.

Il punto importante da notare è che la visualizzazione del database Views TXNouter e TXNinner come transazioni completamente indipendenti, e quindi due commit indipendenti.

Propagation_Nestato

class Service {
    @Transactional(propagation=Propagation.NESTED)
    public void doSomething() {
        // access a database using a DAO
    }
}
.

annidato può essere utilizzato solo se il tuo driver JDBC e / o il database supporta jdbc savepoint Quando Dosomething () viene chiamato inizierà una nuova transazione se il chiamante non ha già avviato una transazione .

Se il chiamante di questo metodo ha già avviato una transazione, viene utilizzata la transazione dei chiamanti e non viene creata alcuna nuova transazione (cioè c'è una transazione in gioco). Tuttavia un "Savepoint" è contrassegnato sulla transazione quando è inserito Dosomething ().

Se un'eccezione viene lanciata all'interno di Dosomething (), la transazione può essere parzialmente arrotolata la transazione per "Savepoint". Il chiamante continuerà con la transazione.

Quando Dosomething () restituisce senza un'eccezione è il chiamante che commetterà l'intera transazione (o ritorno).

Il punto importante da notare è che il database visualizza solo una transazione e c'è solo un commit.

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