На что нужно обращать внимание при использовании аннотации @Transactional в Spring?

«На что нужно обращать внимание при использовании аннотации @Transactional в Spring?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ключевые аспекты использования @Transactional:

  1. Механизм проксирования (AOP): Аннотация работает через Spring AOP-прокси. Поэтому:

    • Вызов метода с @Transactional из другого метода того же класса не будет перехвачен прокси, и транзакция не начнется.
    • Метод должен иметь модификатор public.
  2. Обработка исключений и откат (Rollback): По умолчанию откат транзакции происходит только при RuntimeException и Error. Для отката при checked-исключениях (Exception) необходимо указать это явно.

    @Transactional(rollbackFor = Exception.class)
    public void saveData() throws IOException { ... }
  3. Распространение (Propagation): Определяет поведение транзакции, если она вызывается в контексте другой транзакции. Например, Propagation.REQUIRED (по умолчанию) присоединится к существующей, а Propagation.REQUIRES_NEW создаст новую, независимую транзакцию.

  4. Изоляция (Isolation): Определяет уровень изоляции транзакции (например, Isolation.READ_COMMITTED). Важно выбирать в соответствии с требованиями к согласованности данных и параллелизму.

  5. Производительность: Долгие транзакции удерживают соединения с БД и блокировки, что может стать узким местом. Следует минимизировать логику внутри транзакции и избегать операций ввода-вывода.