Environnement: Spring 3, Gestion des transactions personnalisées, transactions JDBC P>
Je viens de lire les documents de printemps sur l'utilisation du modèle de transaction pour gérer la gestion des transactions. il semblait trop complexe em> donc je veux demander: p>
La plupart de mes transactions sont liées à JDBC, ce qui signifie que je déclare juste un Comme je progresse dans ma méthode, dans ma transaction - je veux enregistrer une référence à l'appel de service de repos fort> (nécessaire pour faire rouler cette action), et sur une exception, je viens Pourquoi ne pas simplement fournir une carte dans la transactiontemplate pour stocker des trucs et définir une méthode de restauration personnalisée sur la C'est comme ça que j'y pense, je ne suis pas en train de suivre le chemin du printemps à ce sujet. Quelqu'un peut-il m'aider à combler le fossé entre ce que je veux et comment je l'accomplie le plus efficacement au printemps? Je n'ai besoin que de cela pour quelques opérations de cas spéciales. P> @Transactional code> sur mon service. Mais maintenant
myCustOMrollback () code> appelé strud> qui peut accéder à l'objet précédemment stocké. P>
@Transactional code> Annotation? p>
5 Réponses :
Vous pouvez utiliser les conseils de l'autre (lorsqu'une exception est lancée) et appelez votre méthode ( Alternativement .. Vous pouvez utiliser le tourbet pour commencer et commenter votre transaction (de cette façon, vous pouvez utiliser le gestionnaire de transactions à l'aide de la transaction de printemps à l'aide de la liste myCustMrollback () code>) là-bas, vous pouvez utiliser
transactionsYnchronizationManager Code> Classe pour obtenir la transaction de TheCurrent & Roulez-le ... p>
TransactionsNchronizationManager Code> Classe) P>
Gestion des transactions à ressort Le comportement par défaut pour la restauration automatique est destiné aux exceptions non cochées
Ainsi, pour une exception personnalisée, p> la transaction être roulé si il y a un exception qui correspond à la spécification. Si une exception ne correspond pas non à une exception, elle est propagée à l'appelant du service ou de transactionRolledbackexception Wrapper P> Si vous utilisez Utilisez l'org.springframework.transaction.platformtransactionManager, il s'agit d'exceptions de manutention plus gérées que le modèle P> Vérifiez la documentation http: // statique .springsource.org / Spring / Docs / 3.0.x / Spring-Framework-Référence / HTML / transaction.html P> P>
J'ai relu votre question plusieurs fois et je ne suis pas sûr de comprendre votre question complètement. Je suppose que votre exécution somécode strong> et si cela échoue, vous souhaitez exécuter Si vous voulez le printemps pour la restauration du code. Il ne fera qu'une annulation qui est annulée, comme les transactions JDBC. Supposons que vous ayez une méthode qui effectue 2 appels. P> de sorte que le code ci-dessus sera toujours rentaré. Il annulera la persistance de votre entité, mais pas la création de votre fichier, car cela n'est pas géré par des transactions de printemps, à moins que vous ne fournissez une implémentation personnalisée pour ce être. P> Deuxièmement, le printemps fournit 2 façons de Travailler avec transactions: P> L'approche AspectJ semble plus difficile à configurer, mais n'est pas tellement plus facile à utiliser. Puisque tout ce qui est annoté avec @TransAderal sera intégré (tissé) avec code. Pour le ressort AOP, ce n'est pas le cas. La méthode interne transactionnelle Les appels d'appels par exemple au printemps seront ignorés! Donc, Aspectj fournit une approche plus intuitive. P> Retour à ce que votre question est (le code est tout en 1 classe): p> Alors, que se passe-t-il est tout (qui est renommé) dans l'exécution sera annulé. Et dans Dostuff, vous avez des informations sur les objets utilisés dans l'exécution, vous pouvez désormais utiliser dans MyCustomRollback pour annuler vos produits de repos manuellement. P> Je ne sais pas si j'ai répondu à cette question, mais j'espère que cela aide quelqu'un avec un problème similaire. p> p>
L'utilisation de l'annotation transactionnelle est principalement destinée à réduire la taille du code de la chaudras. Si nous visons à utiliser un mécanisme de traitance d'essais pour des préoccupations transversales. Cela ne semble pas une solution appropriée.
1 solution consiste à implémenter votre propre gestionnaire de transaction en prolongeant un p>
2 solution consiste à utiliser transcordynchronizationManager Class P>
3 solution consiste à utiliser @TransAderalEventListener au cas où vous auriez le printemps 4 p>
à quiconque lisez toujours ceci:
J'ai résolu un problème similaire avec les événements de printemps - comme suggéré par den romain En option 3. Voici l'idée de base (scénario est fictive): p>
Chaque fois que j'effectue des opérations externes qui doivent être renvoyées avec la transaction, je publie un événement à l'intérieur de My L'événement lui-même peut être n'importe quel objet - j'ai créé un pojo avec des détails sur L'entité distante à supprimer. p> Puis j'ai enregistré un écouteur d'événement spécial qui est lié à une phase de transaction - dans mon cas au retour: p> Bien entendu, il est recommandé d'attraper et de loger l'exception à partir de l'opération de restauration, de ne pas perdre l'exception originale à partir de la méthode code> code>. P> Par défaut, ces événements sont synchrones, Mais ils peuvent être fabriqués par une configuration supplémentaire. P> Voici un très bon article sur ce mécanisme, y compris la configuration détaillée et les pièges: Synchronisation des transactions et événements d'application de ressort (dzone) P> tandis que je n'aime pas la solution à 100% car elle cloque la logique commerciale avec l'événement Publier des trucs et se lie au printemps, il fait certainement ce que je m'attends à ce que cela puisse passer le contexte de la méthode transactionnelle à la méthode de restauration - qui n'est pas disponible via un bloc traditionnel Essayer / Catch à l'extérieur de la méthode transactionnelle (à moins que Vous mettez votre contexte dans l'exception elle-même, ce qui n'est pas très agréable). p> p> @Transactional code> méthode en utilisant Prise en charge du ressort (
org.springframework.context.aplicationExtepublisher code>): p>