Traitement de la rupture de Spring-Java Rollback Récemment, je travaillais sur un projet et j'ai accidentellement constaté qu'une classe lançait les opérations de recul des choses, et les données ont été insérées dans la base de données normalement, alors j'ai soigneusement vérifié et examiné la raison spécifique.
Tout commence toujours avec les exceptions vérifiées de Java et les exceptions non chéries.
Alors, quelle est une exception de type d'inspection et qu'est-ce qu'une exception de type non inspection?
Il y a deux points de jugement les plus simples:
1. L'exception non cocher héritée de RuntimeException ou erreur, tandis que l'exception de vérification héritée de l'exception (bien sûr, RuntimeException lui-même est également une sous-classe d'exception).
2. Des exceptions non chantées peuvent être capturées sans être capturées, tandis que les exceptions vérifiées doivent être traitées avec Try ... Catch Instruction Block ou remis l'exception à la méthode supérieure de traitement. En bref, le code doit être écrit pour le traiter.
La structure des exceptions de Java est illustrée dans la figure ci-dessous. Parmi eux, des exceptions qui héritent directement des exceptions doivent être capturées et sont des exceptions vérifiées.
Revenons sur mon code:
1. Le nom de la méthode est précédé par
@Transactional
2. Spring Configuration File ApplicationContext-xxx.xml a également des configurations connexes pour les choses Spring.
<bean id = "TransactionManager"> <propriété name = "dataSource" ref = "dataSource" /> <propriété name = "rollbackOnCommitFailure" value = "true"> </ propriété> </ bean>
Mais pourquoi la chose qui a été soumise après l'exception d'essai ... Catch Throwing Exception n'est pas annulée lorsque la méthode de la couche de service est appelée?
Après avoir vérifié la documentation Spring pertinente, j'ai constaté que la gestion de transaction déclarative de ressort d'origine effectuait des reculs de transaction sur des exceptions non chantées et des exceptions d'exécution par défaut, mais aucune arrière-retour sur les exceptions vérifiées.
L'exception lancée par Try ... Catch in the Code est une exception de type de chèque. Le framework de Spring ne reviendra pas par défaut.
Dans la programmation, des exceptions non chantées peuvent être évitées, tandis que les exceptions vérifiées doivent être traitées avec des blocs d'instruction TRY ou remises à la méthode supérieure pour les gérer. En bref, le code doit être écrit pour les traiter.
Par conséquent, l'exception doit être prise dans le service, puis lancer manuellement une exception non chériale afin que la transaction puisse prendre effet. Par exemple:
Essayez {………} catch (exception e) {……… lancer une nouvelle entreprise (e.getMessage ()); }Bien sûr, nous avons un moyen plus facile de résoudre ce problème, c'est-à-dire modifier la méthode de retour par défaut en annotant les paramètres.
Norollbackfor et Rollbackfor sont définis dans l'annotation @transaction pour spécifier si une certaine exception est annulée.
Utilisez des exemples:
@Transaction (norollbackfor = runtimeException.class)
@Transaction (rollbackfor = exception.class)
Par conséquent, dans la question ci-dessus, vous pouvez ajouter directement le paramètre Rollback @Transaction (rollbackfor = exception.class), qui modifie la méthode de traitement de transaction par défaut.
Révélation:
Cela nous oblige à hériter de l'exception personnalisée de RuntimeException lors de la personnalisation de l'exception, de sorte que lorsqu'elle est lancée, elle sera gérée avec précision par le traitement des transactions par défaut de Spring.
Résumer
Ce qui précède est l'intégralité du contenu de cet article sur le problème de l'échec du retour en arrière de la transaction Java. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!