Todas as instruções do banco de dados são executadas no contexto de uma transação física, mesmo quando não declaramos explicitamente os limites da transação (BEGIN / COMMIT / ROLLBACK).
Se você não declarar os limites da transação explicitamente, cada instrução terá que ser executada em uma transação separada ( autocommit
modo). Isso pode até mesmo levar à abertura e fechamento de uma conexão por instrução, a menos que seu ambiente possa lidar com vinculação de conexão por thread.
Declarar um serviço como @Transactional
fornecerá uma conexão para toda a duração da transação e todas as instruções usarão essa única conexão de isolamento. Isso é muito melhor do que não usar transações explícitas em primeiro lugar.
Em aplicativos grandes, você pode ter muitas solicitações simultâneas e reduzir a taxa de solicitação de aquisição de conexão com o banco de dados definitivamente melhorará o desempenho geral do aplicativo.
JPA não impõe transações em operações de leitura. Apenas as gravações acabam lançando uma exceção de transação necessária caso você se esqueça de iniciar um contexto transacional. No entanto, é sempre melhor declarar os limites da transação, mesmo para transações somente leitura (no Spring @Transactional
permite marcar transações somente leitura, o que tem um grande benefício de desempenho).