← Назад к вопросам

Спрашивал ли про @Transactional

1.0 Junior🔥 161 комментариев
#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

@Transactional в Spring: Полное руководство

@Transactional — это аннотация из Spring Framework, которая декларативно управляет транзакциями на уровне методов. Это ключевой инструмент для обеспечения ACID-свойств при работе с базами данных и может быть решающим фактором на собеседовании.

Основной принцип работы

Аннотация работает на базе AOP (Aspect-Oriented Programming). Spring создаёт прокси вокруг класса, и при каждом вызове помеченного метода:

  1. Начинается транзакция перед выполнением метода
  2. Выполняется бизнес-логика с полной изоляцией
  3. Коммитится или откатывается в зависимости от результата
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void createUser(String name, String email) {
        User user = new User(name, email);
        userRepository.save(user);
    }
}

Критические параметры

1. propagation (распространение транзакции)

  • REQUIRED (default) — использует существующую или создаёт новую
  • REQUIRES_NEW — всегда создаёт новую независимую транзакцию
  • NESTED — вложенная транзакция (savepoint)
  • MANDATORY — требует существующей, иначе исключение

2. isolation (уровень изоляции)

  • DEFAULT — уровень БД
  • READ_COMMITTED — стандарт, предотвращает грязное чтение
  • REPEATABLE_READ — фантомное чтение позволено
  • SERIALIZABLE — максимальная изоляция

3. rollbackFor / noRollbackFor

По умолчанию откат происходит только на unchecked exceptions. Checked exceptions не откатывают!

4. readOnly

Оптимизирует запросы только для чтения, БД может пропустить lock и flush

Частые ошибки

Вызов @Transactional метода внутри класса — прокси не вызовется

@Transactional на приватных методах — прокси не перехватит

Забыли про Checked exceptions — SQLException не откатит по умолчанию

Лучшие практики

  1. Держи @Transactional на сервис-слое
  2. Минимизируй область действия
  3. Явно указывай параметры для non-default значений
  4. Тестируй откат
  5. Избегай N+1 запросов внутри транзакции
Спрашивал ли про @Transactional | PrepBro