Назад к вопросам
Северсталь-Ифоком
Junior — Middle
53
Как определить количество транзакций при вызове метода, аннотированного @Transactional, из другого метода с такой же аннотацией, расположенного в другом классе в Spring?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
В Spring аннотация @Transactional управляет транзакциями на уровне прокси. При вызове метода с @Transactional из другого класса, также аннотированного @Transactional, Spring создаёт или использует существующую транзакцию в зависимости от настроек propagation.
Чтобы определить количество транзакций при таком вызове, нужно учитывать:
- Propagation (поведение распространения транзакций): по умолчанию
REQUIRED— если транзакция уже есть, метод будет выполняться в её рамках, новая не создаётся. - Вызов из другого класса: прокси Spring срабатывает, и управление транзакциями происходит корректно.
Для точного подсчёта транзакций можно использовать:
- Логирование или отладку транзакционного менеджера.
- Внедрение кастомного
PlatformTransactionManagerили слушателя транзакций. - Использование AOP для перехвата начала и окончания транзакций.
Пример логирования начала транзакции:
@Component
public class TransactionLogger implements TransactionSynchronization {
@Override
public void beforeCommit(boolean readOnly) {
System.out.println("Транзакция начинается");
}
@Override
public void afterCompletion(int status) {
System.out.println("Транзакция завершена");
}
}
И регистрацию этого слушателя в TransactionSynchronizationManager.
Таким образом, при вызове метода с @Transactional из другого класса с @Transactional обычно будет одна транзакция, если не изменён propagation.