Не уверен, что здесь термин «область действия» правильный.
Я использую Spring для управления транзакциями JPA (с Hibernate внизу). Мой метод для преобразования транзакции базы данных является частным, но поскольку вы можете установить @Transactional только для класса или для открытого метода
Поскольку этот механизм основан на прокси, будут перехватываться только внешние вызовы методов, поступающие через прокси. Это означает, что «самовывоз», то есть метод в целевом объекте, вызывающий какой-либо другой метод целевого объекта, не приведет к реальной транзакции во время выполнения, даже если вызванный метод помечен @Transactional!
Я установил общедоступную точку входа класса как @ Transactional.
@Transactional
public void run(parameters) {
//First non-database method, takes a decent amount of time
Data data = getData();
//Call to database
storeData(data);
}
private storeData(data) {
em.persist(data);
}
Это плохая практика? Spring сохраняет открытую транзакцию дольше, чем необходимо здесь? Я думал о том, чтобы переместить метод storeData () в класс DAO и сделать его общедоступным, но в качестве академического соображения я хотел бы знать, принесет ли рефакторинг для public какой-либо выигрыш в производительности.