web-dev-qa-db-fra.com

JdbcTemplate et transactions du printemps

Lorsque j'utilise JdbcTemplate, dois-je configurer explicitement les transactions?

Ma disposition de code ressemble à ceci:

J'aurai un UserDao qui sera injecté dans mon UserService, puis mes contrôleurs effectueront des appels sur les méthodes de mon UserService.

Je veux que les choses restent aussi simples que possible sur le plan des transactions, et je n'ai pas besoin de plusieurs appels de base de données pour couvrir une transaction.

Par défaut, dois-je faire quoi que ce soit dans mon fichier de configuration ou utiliser un @Transaction annotation n'importe où?

Maintenant, dites dans mon contrôleur que j'ai besoin de faire 2 appels sur mon userService et accountService, pourrais-je l'envelopper explicitement dans une transaction d'une manière ou d'une autre?

userService.updateUser(user);
accountService.updateXXX(...);
18
loyalflow

Oui, JdbcTemplate ne remplace pas la gestion des transactions. Vous bénéficiez toujours des transactions de base de données, donc userService.updateUser fonctionnera dans une transaction de base de données , mais si accountService.updateXXX échoue, userService.updateUser ne sera pas annulé .

Si vous ne souhaitez pas utiliser AOP, vous pouvez utiliser TransactionTemplate à la place. Voir gestion des transactions programmatiques dans le Spring Reference Documentation .

Un modèle que j'ai vu auparavant est que la classe de contrôleur MVC appelle un service métier, qui encapsule l'opération. La méthode de la classe affaires pourrait alors être annotée @Transactional.

25
David Grant

Si votre contrôleur veut faire plusieurs choses avec les utilisateurs et les comptes et que tout cela se passe au sein d'une même transaction, alors vous devriez avoir un service avec une méthode qui fait tout cela. La création d'un service par DAO n'est pas une bonne idée, car vous vous retrouvez avec des wrappers de ne rien faire autour des DAO et le traitement sera lent car la base de données devra créer une transaction distincte pour chaque appel à un DAO, vous le faites beaucoup plus de travail que nécessaire.

Le service doit fournir des fonctionnalités au contrôleur ou à toute autre personne qui l'appelle. J'essaie de créer des services avec l'idée que le service fournit des fonctions spécifiques utiles à un certain type d'utilisateur.

13
Nathan Hughes