Todas las declaraciones de la base de datos se ejecutan dentro del contexto de una transacción física, incluso cuando no declaramos explícitamente los límites de la transacción (BEGIN / COMMIT / ROLLBACK).
Si no declara los límites de la transacción explícitamente, entonces cada declaración deberá ejecutarse en una transacción separada ( autocommit
modo). Esto incluso puede llevar a abrir y cerrar una conexión por declaración a menos que su entorno pueda lidiar con el enlace de conexión por subproceso.
Declarar un servicio como @Transactional
le dará una conexión durante toda la duración de la transacción, y todas las declaraciones utilizarán esa única conexión de aislamiento. Esto es mucho mejor que no utilizar transacciones explícitas en primer lugar.
En aplicaciones grandes, es posible que tenga muchas solicitudes simultáneas, y la reducción de la tasa de solicitudes de adquisición de conexión de base de datos definitivamente mejorará el rendimiento general de su aplicación.
JPA no impone transacciones en operaciones de lectura. Solo las escrituras terminan lanzando una excepción de transacción requerida en caso de que olvide iniciar un contexto transaccional. Sin embargo, siempre es mejor declarar los límites de las transacciones incluso para las transacciones de solo lectura (en Spring le @Transactional
permite marcar transacciones de solo lectura, lo que tiene un gran beneficio de rendimiento).