Avant de parler de la gestion des transactions Spring, réfléchissons à la façon dont nous effectuons des opérations de données en hibernate lorsque nous n'utilisons pas le printemps. Dans Hibernate, nous devons d'abord démarrer la transaction, puis effectuer des opérations de données, puis soumettre la transaction et fermer la transaction. La raison pour laquelle nous le faisons est due au fait que la transaction par défaut d'Hibernate est fausse, ce qui nous oblige à soumettre manuellement la transaction. Si vous ne souhaitez pas soumettre manuellement la transaction à chaque fois, vous pouvez le définir pour engager automatiquement la transaction dans mon fichier hibernate.cfg.xml:
code XML
<propriété name = "defaultautoCommit"> <value> false </value> </ propriété>
Même si nous définissons sa méthode de validation de transaction à Automatic, elle peut effectuer des opérations de données, cela ne répond pas à nos besoins commerciaux réels, car parfois après avoir enregistré une données, j'espère qu'elle pourra continuer à enregistrer d'autres données. J'espère engager la transaction ensemble après avoir enregistré deux données ou plus. De cette façon, même s'il y a une erreur, nous pouvons reculer et sécuriser la cohérence des données. Soit le succès ou l'échec. Pour le moment, nous ne pouvons pas engager automatiquement la transaction après avoir enregistré une données, car elles ne sont pas dans la même transaction, et nous ne pouvons garantir la cohérence des données. Ainsi, nous devons donc configurer manuellement nos transactions, ce qui nécessite l'utilisation du mécanisme de gestion des transactions fourni par Spring pour Hibernate. La gestion des transactions fournie par Spring peut être divisée en deux catégories: programmatique et déclarative. La programmation est en fait contrôlée dans le code. Tout comme HiberNate exploite des données, il démarre les transactions et soumet les transactions. Cette méthode a certaines limites, nous utilisons donc généralement un déclaratif pour configurer nos transactions.
La configuration de la transaction déclarative est principalement divisée en les étapes suivantes:
1. Configuration de la transaction déclarative
(1) Configurer le gestionnaire de transactions;
(2) les caractéristiques de propagation de la transaction;
(3) Ces classes et méthodes utilisent des transactions.
<! - Configurez le SessionFactory selon lequel le gestionnaire de transactions spécifie sa fonction et remettez la transaction à ressortir pour le traitement -> <bean id = "TransactionManager"> <propriété = "SessionFactory"> <reflean = "SessionFactory" /> </ propriété> </Ean> <! - Configurez les caractéristiques de propagation des transactions -> <tx: conseil = "TxADVIC <tx: attributs> <tx: méthode name = "enregistrer *" propagation = "requise" /> <tx: méthode name = "delete *" propagation = "requise" /> <tx: méthode name = "update *" propagation = "requise" /> <tx: méthode name = "get *" read-only = "true" propagation = "not_supported" read-only = "true" /> </ tx: attributs> </ tx: conseils> <! - Quelles méthodes de ces classes participent à des transactions -> <aop: config> <aop: Pointcut id = "alserviceMethod" expression = "EXECUTION (* com.coe.service. *. * (..)" /> <aop: adv dans le PointCut-réf = "AllSerceMoD" conseils-ref = "txadvice" /> </ aop: config>
Lors de la configuration des transactions, nous définissons généralement la limite de transaction sur la couche de service, c'est-à-dire votre couche de logique métier, car nous terminons souvent certaines de nos colonnes d'opérations de données dans notre couche logique métier. Si elle est placée dans la couche de données DAO, la granularité est trop petite. De plus, si nous configurons les transactions dans la couche logique métier, elle sera également bénéfique pour notre cache secondaire, que vous trouverez à l'avenir lorsque vous l'exploitez.
2. Écrivez des méthodes de logique métier
À l'heure actuelle, nous pouvons utiliser les méthodes de fonctionnement des données fournies dans HiberNateTemplate pour rédiger nos méthodes de logique métier dans notre couche de logique métier. Bien sûr, notre méthode doit être la même que celle configurée dans notre configuration de transaction, en utilisant Enregistrer, supprimer, mettre à jour et obtenir le début de notre méthode. Il convient de noter que par défaut, l'exception d'exécution ne fera que reculer (y compris l'héritage de la sous-classe RuntimeException), et les exceptions ordinaires ne rouleront pas.
Enfin, résumons les différentes caractéristiques de propagation des transactions:
1. Propagation_Required: Si une transaction existe, la transaction actuelle est prise en charge. S'il n'y a pas de transaction, il sera activé;
2. Propagation_Supports: Si une transaction existe, la transaction actuelle est prise en charge. S'il n'y a pas de transaction, l'exécution des non-transactions;
3. Propagation_mandator: Si une transaction existe déjà, la transaction actuelle est prise en charge. S'il n'y a pas de transaction active, une exception est lancée;
4. Propagation_Requires_New: Ouvrez toujours une nouvelle transaction. Si une transaction existe déjà, la transaction existante est suspendue;
5. Propagation_Not_Supported: Exécutez toujours non transactionnellement et suspendez toute transaction existante;
6. Propagation_Never: toujours exécuté de manière non transactionnelle, si une transaction active existe, une exception est lancée;
7. Propagation_neSéed: Si une transaction active existe, elle s'exécute dans une transaction imbriquée. S'il n'y a pas de transaction active, exécutez-la en fonction de la propriété TransactionDefinition.Propagation_Required.
Grâce à cet article, j'espère qu'il peut vous aider à comprendre la gestion intégrée des transactions de Spring et Hibernate. Merci pour votre soutien pour ce site Web!