#java #spring #spring-boot #transactions #spring-transactions
#java #spring #весенняя загрузка #транзакции #spring-транзакции
Вопрос:
У меня есть сложный метод обслуживания, который загружает много данных из базы данных. Поскольку он только считывает и проверяет данные, я хочу убедиться
- JPA (Hibernate) не тратит время на проверку большого контекста сохранения изменений.
- Никакие случайные изменения данных не записываются в БД.
Поэтому к концу моей службы у меня есть этот код
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
В моих модульных тестах есть макеты для всего доступа к БД, поэтому транзакция не является проблемой. (У меня также есть интеграционный тест с @SpringBootTest
и полной поддержкой trx.) К сожалению, оператор отката не выполняется в чистых модульных тестах.
Есть ли простой способ получить инструкцию отката, просто ничего не делая в случае модульного теста?
Комментарии:
1. Есть ли у вас автоматическое переключение в режим гибернации и каков уровень распространения для метода, который вы вызываете?
2. Это чистый модульный тест. Нет базы данных, спящего режима, транзакций. Я только хочу протестировать внутреннюю логику сервиса. Тот факт, что все откатывается, является просто мерой безопасности / производительности.
Ответ №1:
На данный момент я просто написал небольшой компонент, который легко издеваться:
@Component
public class RollBacker {
public void setRollBackOnly() {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
В конце концов, это одноэлементный подход TransactionAspectSupport
, который затрудняет модульное тестирование здесь. ИМХО TransactionAspectSupport
должен быть компонент spring.
Ответ №2:
Рассмотрите возможность использования @Transactional(readOnly=true)
вместо TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
.
Логический флаг, который может быть установлен в значение true, если транзакция доступна только для чтения, что позволяет выполнять соответствующую оптимизацию во время выполнения.
Комментарии:
1. Как упоминалось в вопросе, нет
@SpringBootTest
. У меня нет, и в данном случае мне не нужны транзакции или даже полный контекст приложения. Просто обычный ванильный модульный тест.