11 votes

Transactions Spring avec propagation des supports

J'aimerais comprendre l'utilité d'avoir une transaction spring avec Propagation Supports. La docs java mentionne que si la méthode qui a @Transactional(propagation = Propagation.SUPPORTS) est appelée à l'intérieur d'une transaction, elle prend en charge la transaction, mais si aucune transaction n'existe, la méthode est exécutée de manière non transactionnelle.

N'est-ce pas déjà le comportement des transactions de Spring indépendamment de Propagation.SUPPORTS ?

public class ServiceBean {

    @Transactional(propagation = Propagation.SUPPORTS)
    public void methodWithSupportsTx() {
        //perform some database operations
    }
}

public class OtherServiceBean {

    @Transactional(propagation = Propagation.REQUIRED)
    public void methodWithRequiredTx() {
        //perform some database operations
        serviceBean.methodWithSupportsTx();
    }
}

Dans l'exemple de code ci-dessus, indépendamment du fait que methodWithSupportsTx() tiene @Transactional(propagation = Propagation.SUPPORTS) il serait exécuté dans une transaction selon que l'annotation methodWithRequiredTx() tiene @Transactional annotation, n'est-ce pas ?

Alors, quel est le besoin ou l'utilité d'avoir un niveau de propagation SUPPORTS ?

5voto

axtavt Points 126632

De javadoc :

Remarque : Pour les gestionnaires de transactions avec synchronisation des transactions, PROPAGATION_SUPPORTS est légèrement différent de l'absence totale de transaction, car il définit une portée de transaction pour laquelle la synchronisation s'appliquera. Par conséquent, les mêmes ressources (connexion JDBC, session Hibernate, etc.) seront partagées pour toute la portée spécifiée. Notez que cela dépend de la configuration réelle de la synchronisation du gestionnaire de transactions.

Cela signifie donc que, par exemple, de multiples invocations de la méthode d'Hibernate SessionFactory.getCurrentSession() à l'intérieur de methodWithSupportsTx() renverrait la même session.

-2voto

Kevin Bowersox Points 48223

Une transaction requise créera une nouvelle transaction si aucune n'existe. Par conséquent, une nouvelle transaction sera créée lorsque vous appellerez serviceBean.methodWithSupportsTx(). Si votre méthode est réellement transactionnelle, vous verrez une erreur de Spring si aucune transaction n'existe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X