Toutes les instructions de la base de données sont exécutées dans le contexte d'une transaction physique, même lorsque nous ne déclarons pas explicitement les limites de la transaction (par exemple, BEGIN, COMMIT, ROLLBACK).
Si vous ne déclarez pas explicitement les limites de transaction, chaque instruction devra être exécutée dans une transaction distincte ( autocommit
). Cela peut même conduire à l'ouverture et à la fermeture d'une connexion par instruction, à moins que votre environnement ne puisse gérer la liaison connexion-par-fil.
Déclarer un service comme @Transactional
vous donnera une connexion unique pour toute la durée de la transaction, et toutes les déclarations utiliseront cette connexion d'isolation unique. C'est bien mieux que de ne pas utiliser de transactions explicites en premier lieu.
Sur les grandes applications, vous pouvez avoir de nombreuses demandes simultanées, et la réduction du taux de demande d'acquisition de connexion à la base de données améliorera certainement les performances globales de votre application.
JPA n'applique pas les transactions aux opérations de lecture. Seules les écritures finissent par lancer un TransactionRequiredException
au cas où vous oublieriez de lancer un contexte transactionnel. Néanmoins, il est toujours préférable de déclarer des limites de transaction même pour les transactions en lecture seule (dans Spring @Transactional
vous permet de marquer les transactions en lecture seule, ce qui présente un grand avantage en termes de performances).