Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
@Transactional в Spring: Полное руководство
@Transactional — это аннотация из Spring Framework, которая декларативно управляет транзакциями на уровне методов. Это ключевой инструмент для обеспечения ACID-свойств при работе с базами данных и может быть решающим фактором на собеседовании.
Основной принцип работы
Аннотация работает на базе AOP (Aspect-Oriented Programming). Spring создаёт прокси вокруг класса, и при каждом вызове помеченного метода:
- Начинается транзакция перед выполнением метода
- Выполняется бизнес-логика с полной изоляцией
- Коммитится или откатывается в зависимости от результата
@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 не откатит по умолчанию
Лучшие практики
- Держи @Transactional на сервис-слое
- Минимизируй область действия
- Явно указывай параметры для non-default значений
- Тестируй откат
- Избегай N+1 запросов внутри транзакции