Назад к вопросам
Middle
116
questionbank

Что обозначает аннотация @Transactional в Spring Data?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Аннотация @Transactional в Spring Data указывает, что метод или класс должен выполняться в рамках транзакции. Spring AOP (Aspect-Oriented Programming) создает вокруг такого метода прокси-объект, который управляет жизненным циклом транзакции.

Основные действия, выполняемые @Transactional:

  1. Начало транзакции: Перед выполнением аннотированного метода открывается новая транзакция или используется существующая.
  2. Выполнение метода: Выполняется логика самого метода.
  3. Фиксация или откат транзакции:
    • Если метод завершается успешно без исключений (по умолчанию только RuntimeException), транзакция фиксируется (commit).
    • Если из метода выбрасывается исключение (по умолчанию RuntimeException), транзакция откатывается (rollback).

Основные атрибуты аннотации:

  • propagation: Определяет, как транзакции взаимодействуют друг с другом (например, REQUIRED, REQUIRES_NEW, SUPPORTS). По умолчанию REQUIRED.
  • isolation: Определяет уровень изоляции транзакции для предотвращения проблем параллельного доступа к данным (например, READ_COMMITTED, REPEATABLE_READ). По умолчанию используется уровень изоляции базы данных.
  • readOnly: Указывает, что транзакция должна выполняться в режиме только для чтения. Оптимизирует производительность для чтений.
  • timeout: Задает максимальное время выполнения транзакции до автоматического отката.
  • rollbackFor: Указывает список типов исключений, при возникновении которых должен происходить откат транзакции. По умолчанию откатывается на RuntimeException.
  • noRollbackFor: Указывает список типов исключений, при возникновении которых откат транзакции не должен происходить.

Пример использования:

// Пример сервисного слоя
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional // Этот метод будет выполняться в транзакции
    public User createUser(User user) {
        // Логика создания пользователя, возможно, включает несколько операций с БД
        userRepository.save(user);
        // Может быть другая операция сохранения или обновления
        // userRepository.updateRelatedInfo(user.getId(), ...);
        return user;
    }

    @Transactional(readOnly = true) // Метод только для чтения, оптимизация
    public User findUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    @Transactional(rollbackFor = CustomBusinessException.class) // Откат при определенном пользователем исключении
    public void performCriticalOperation(Long userId) throws CustomBusinessException {
        // Логика критической операции
        // Может выбросить CustomBusinessException
    }
}

Аннотация @EnableTransactionManagement обычно используется в конфигурационном классе, чтобы включить поддержку декларативного управления транзакциями.