Ответ
Ключевые аспекты использования @Transactional:
-
Механизм проксирования (AOP): Аннотация работает через Spring AOP-прокси. Поэтому:
- Вызов метода с
@Transactionalиз другого метода того же класса не будет перехвачен прокси, и транзакция не начнется. - Метод должен иметь модификатор
public.
- Вызов метода с
-
Обработка исключений и откат (Rollback): По умолчанию откат транзакции происходит только при
RuntimeExceptionиError. Для отката при checked-исключениях (Exception) необходимо указать это явно.@Transactional(rollbackFor = Exception.class) public void saveData() throws IOException { ... } -
Распространение (Propagation): Определяет поведение транзакции, если она вызывается в контексте другой транзакции. Например,
Propagation.REQUIRED(по умолчанию) присоединится к существующей, аPropagation.REQUIRES_NEWсоздаст новую, независимую транзакцию. -
Изоляция (Isolation): Определяет уровень изоляции транзакции (например,
Isolation.READ_COMMITTED). Важно выбирать в соответствии с требованиями к согласованности данных и параллелизму. -
Производительность: Долгие транзакции удерживают соединения с БД и блокировки, что может стать узким местом. Следует минимизировать логику внутри транзакции и избегать операций ввода-вывода.