Аннотация `@Transactional(readOnly = true)` используется в Spring для обозначения того, что данный метод или класс должен выполняться в транзакции, которая только читает данные (без их изменения). Это может использоваться для оптимизации работы с базой данных, потому что некоторые базы данных могут использовать разные стратегии управления транзакциями и блокировками для операций, которые только считывают данные.
Если вы не используете аннотацию `@Lock`, применение `@Transactional(readOnly = true)` все равно может иметь смысл по следующим причинам:
1. **Оптимизация производительности**: Если ваша база данных поддерживает это, аннотация может позволить системе использовать более легкие механизмы управления транзакциями для операций чтения, что может привести к лучшей производительности.
2. **Ясность кода**: Использование `@Transactional(readOnly = true)` делает намерение вашего кода более явным для других разработчиков. Это сигнализирует о том, что метод предполагается использовать только для чтения, и нет намерения изменять данные.
3. **Проверка на уровне приложения**: В некоторых случаях может быть настроена логика на уровне приложения, которая проверяет тип транзакции. Например, может быть возможность логирования или другие меры, специфичные для операций чтения.
Хотя `@Lock` предназначена для управления блокировками на уровне JPA (или другого механизма), `@Transactional(readOnly = true)` служит больше для оптимизации и декларативного обозначения намерений. Так что если вы хотите улучшить производительность и сделать код более понятным, использование `@Transactional(readOnly = true)` без `@Lock` будет целесообразным.