Все операторы базы данных выполняются в контексте физической транзакции, даже если мы явно не объявляем границы транзакции (BEGIN / COMMIT / ROLLBACK).
Если вы не объявляете границы транзакции явно, тогда каждый оператор должен будет выполняться в отдельной транзакции ( autocommit
режиме). Это может даже привести к открытию и закрытию одного соединения для каждого оператора, если ваша среда не может иметь дело с привязкой соединения к потоку.
Объявление службы as @Transactional
даст вам одно соединение на весь период транзакции, и все операторы будут использовать это одно изолированное соединение. Это лучше, чем вообще не использовать явные транзакции.
В больших приложениях у вас может быть много одновременных запросов, и уменьшение количества запросов на получение соединения с базой данных определенно улучшит общую производительность вашего приложения.
JPA не применяет транзакции к операциям чтения. Только записи в конечном итоге вызывают исключение, необходимое для транзакции, если вы забыли запустить транзакционный контекст. Тем не менее, всегда лучше объявлять границы транзакций даже для транзакций только для чтения (в Spring @Transactional
позволяет помечать транзакции только для чтения, что дает большое преимущество в производительности).