Question

Les Documents de printemps faire unFantastique travail de décrivant des propriétés de propagation transactionnelle.

Cependant, je me demandais s'il y a des exemples bien connus et réels disponibles, qui décrivent chacune de ces propriétés de manière plus approfondie dans les termes de layman?

Était-ce utile?

La solution

propagation_requiked

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

Lorsque Dosomething () est appelé, il démarrera une nouvelle transaction si l'appelant n'a pas déjà démarré une transaction .

Si l'appelant de cette méthode a déjà démarré une transaction, la transaction des appelants est utilisée et aucune nouvelle transaction n'est créée (c'est-à-dire une transaction en jeu).

Si une exception est projetée à l'intérieur du dosage (), elle sera renvoyée, ce qui signifie que l'appelant verra également la transaction roulé.

Lorsque Dosomething () retourne, la transaction n'aura pas encore été commise. C'est l'appelant qui commettrait la transaction (ou éventuellement roulé).

propagation_requires_new

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

Lorsque DOSMATHIAT () est appelé, il sera toujours démarrer une nouvelle transaction.

Si l'appelant de cette méthode a déjà démarré une transaction (TXNouter), la transaction des appelants est suspendue et une nouvelle transaction (TXNINNER) est créée (c'est-à-dire qu'il existe deux transactions en jeu).

Si une exception est projetée à l'intérieur du dosage (), TXninner sera renvoyée, mais la transaction "suspendue" de l'appelant (TXNouter) n'est pas affectée.

Lorsque Dosomething () revient sans une exception, elle commettrait la transaction (TXninner). La transaction de l'appelant (TXNouter) reprendra et ignorera qu'une autre transaction a été commise. L'appelant peut alors commettre ou rouler TXNouter comme il voit l'ajustement.

Le point important à noter est que la base de données visualez TXnouter et TXNinner comme transactions entièrement indépendantes, et donc deux engagements indépendants.

propagation_ned

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

niché ne peut être utilisé que si votre pilote JDBC et / ou votre base de données prend en charge points de sauvegarde JDBC

Lorsque Dosomething () est appelé, il démarrera une nouvelle transaction si l'appelant n'a pas déjà démarré une transaction .

Si l'appelant de cette méthode a déjà démarré une transaction, la transaction des appelants est utilisée et aucune nouvelle transaction n'est créée (c'est-à-dire une transaction en jeu). Cependant, un "point de sauvegarde" est marqué sur la transaction lorsque Dosomething () est entré.

Si une exception est projetée à l'intérieur du dosomething (), la transaction peut alors être effectuée partiellement la transaction vers le «sauvegarde». L'appelant continuera avec la transaction.

Lorsque Dosomething () retourne sans une exception, il s'agit de l'appelant qui engagera toute la transaction (ou le retourner).

Le point important à noter est que la base de données ne vise qu'une seule transaction et il n'y a qu'un seul commit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top