Усі висловлювання бази даних виконуються в контексті фізичної транзакції, навіть коли ми не заявляємо прямо межі транзакції (BEGIN / COMMIT / ROLLBACK).
Якщо ви не декларуєте явні межі транзакцій, то кожне твердження доведеться виконувати в окремій транзакції ( autocommit
режимі). Це навіть може призвести до відкриття та закриття одного з'єднання на оператор, якщо ваше оточення не може мати справу з прив'язкою з'єднання за потоком.
Якщо оголосити послугу такою @Transactional
, ви отримаєте одне з'єднання протягом усієї тривалості транзакції, і всі оператори будуть використовувати це єдине з'єднання для ізоляції. Це краще, ніж спочатку не використовувати явні транзакції.
У великих програмах у вас може бути багато одночасних запитів, і зниження швидкості запитів на отримання з'єднання з базою даних безумовно покращить вашу загальну ефективність програми.
JPA не примушує операцій з операціями читання. Тільки записи, які закінчуються, кидають необхідну виняток транзакції, якщо ви забудете запустити контекст транзакції. Тим не менш, завжди краще оголошувати межі транзакцій навіть для транзакцій лише для читання (навесні @Transactional
дозволяє позначити транзакції лише для читання, що має велику перевагу від ефективності).