@Transactional (propagation = Propagation.REQUIS)


Réponses:


65

Lorsque le paramètre de propagation est PROPAGATION_REQUIRED, une étendue de transaction logique est créée pour chaque méthode sur laquelle le paramètre est appliqué. Chaque étendue de transaction logique de ce type peut déterminer individuellement l'état de restauration uniquement, une étendue de transaction externe étant logiquement indépendante de la portée de transaction interne. Bien entendu, en cas de comportement PROPAGATION_REQUIRED standard, toutes ces étendues seront mappées sur la même transaction physique. Ainsi, un marqueur d'annulation uniquement défini dans la portée de la transaction interne affecte les chances de validation de la transaction externe (comme vous vous y attendez).

entrez la description de l'image ici

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


166

Si vous avez besoin d'une explication profane de l'utilisation au-delà de celle fournie dans les Spring Docs

Considérez ce code ...

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

Lorsque doSomething () est appelé, il sait qu'il doit démarrer une transaction sur la base de données avant de l'exécuter. Si l'appelant de cette méthode a déjà démarré une transaction, cette méthode utilisera cette même transaction physique sur la connexion à la base de données actuelle.

Cette @Transactionalannotation fournit un moyen de dire à votre code lorsqu'il s'exécute qu'il doit avoir une transaction. Il ne fonctionnera pas sans un, donc vous pouvez faire cette hypothèse dans votre code que vous ne serez pas laissé avec des données incomplètes dans votre base de données, ou devrez nettoyer quelque chose si une exception se produit.

La gestion des transactions est un sujet assez compliqué, donc j'espère que cette réponse simplifiée sera utile



s'il utilise une configuration basée sur un proxy pour déclarer et accéder à la couche DAO, la méthode dans la classe DAO doit également être annotée avec @Transactional.
Kurapika

Si vous avez ajouté @Transactionalà votre couche de service, il n'est pas nécessaire d'ajouter également @Transactionalaux méthodes DAO appelées dans cette transaction.
Brad

si doSomething()invoque une autre méthode imbriquée sans @transactional, cette même transaction s'appliquera-t-elle également à cette méthode appelante?
thisarattr

Oui, tant que le même Thread est utilisé pour exécuter une méthode imbriquée (c'est-à-dire que vous ne créez pas un nouveau Thread explicitement). En effet, les transactions Spring sont liées au thread actuel à l'aide de variables ThreadLocal
Brad

15

Dans les applications Spring, si vous activez la prise en charge des transactions basées sur les annotations en utilisant <tx:annotation-driven/>et annotez n'importe quelle classe / méthode avec @Transactional (propagation = Propagation.REQUIRED), Spring Framework démarrera une transaction et exécutera la méthode et valide la transaction. Si une exception RuntimeException s'est produite, la transaction sera annulée.

En fait propagation = Propagation.REQUIRED est le niveau de propagation par défaut, vous n'avez pas besoin de le mentionner explicitement.

Pour plus d'informations: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations


5

Pour comprendre les différents paramètres et comportements transactionnels adoptés pour la gestion des transactions, tels que REQUIRED, ISOLATIONetc., vous devrez comprendre les bases de la gestion des transactions elle-même.

Lisez la gestion de la traction pour en savoir plus.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.