Question

En mettant à niveau mon projet, je pense ici aux transactions.
Eh bien, le problème c'est que je ne suis pas sûr quand dois-je utiliser les transactions pour mes requêtes Hibernate au printemps.
Non pas que je ne comprenne pas du tout ce que sont les transactions, je suppose que oui, mais
Dois-je utiliser des transactions pour un get* tapez des requêtes en définissant simplement le read-only attribut?

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!-- all methods starting with 'get' are read-only -->
        <tx:method name="get*" read-only="true" />
        <!-- other methods use the default transaction settings -->
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>

Est-ce efficace pour get* des requêtes ?
Parce que, pour autant que je pense, l'utilisation des transactions devrait se faire comme pour CREATE, UPDATE, DELETE et de telles requêtes.
Est-ce que j'ai râté quelque chose?

Était-ce utile?

La solution

L'utilisation des transactions dépend quelque peu des besoins.

Évidemment, utiliser des transactions sur les opérations UPDATE et DELETE est logique.L'utilisation de transactions sur des instructions SELECT pourrait également être utile si, par exemple, vous deviez verrouiller l'enregistrement de telle sorte qu'un autre thread/requête ne modifie pas la lecture.Il s’agirait généralement d’une exigence commerciale.

Dans notre entreprise, nous enveloppons toutes les déclarations (c.-à-d.SELECT, UPDATE, DELETE) dans une transaction.

De plus, la gestion transactionnelle est vraiment mieux adaptée à une autre couche en plus du niveau des données.En général, les transactions correspondent aux besoins de l'entreprise.Par exemple, si l'exigence est de déposer de l'argent sur un compte, alors une classe/un code de niveau supérieur doit être utilisé pour marquer l'ensemble de la méthode comme transactionnelle, car cette méthode spécifique doit être complétée en une seule unité (puisqu'il y aurait probablement plusieurs bases de données). appels).

Spring a beaucoup à dire sur la gestion transactionnelle.

Autres conseils

Ce semble être une réponse assez décente à la raison pour laquelle vous devriez le faire.Cependant, ce donne quelques raisons de ne pas le faire.En gros, vous souhaitez les utiliser lorsque les données pourraient se retrouver dans un mauvais état si vos modifications ne sont pas terminées.

Une bonne règle consiste à gérer les transactions à un niveau d’application supérieur à DAO.De cette façon, si vous avez une opération d'accès aux données A qui doit parfois être exécutée dans votre propre transaction et qui doit parfois rejoindre la transaction existante, vous n'aurez pas à franchir les étapes.Combinez cette approche avec la gestion des transactions (et des sessions Hibernate) via AOP et regardez votre code devenir plus compréhensible et maintenable.

Pour répondre à votre question spécifique sur les getters :

Si vous utilisez une transaction AOP avec readOnly true, et Si vous configurez correctement votre dialecte JPA pour hiberner, Spring mettra votre session Hibernate en mode sans vidage.Cela peut se traduire par des améliorations substantielles des performances pour les opérations à volume élevé en éliminant les vérifications inutiles.Cela vaut donc la peine à cet égard.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top