Sobes.tech
Назад к вопросам
Senior
5

Какой у вас опыт со Spring Data (JPA, JDBC, Redis)? Какие интересные проблемы встречались с @Transactional?

Компании, где спрашивали
Napoleon IT

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

sobes.tech AI

Опыт со Spring Data:

  • JPA использую для ORM с Hibernate, удобно для работы с реляционными базами, поддерживает ленивую загрузку, кэширование первого уровня.
  • JDBC применяю для высокопроизводительных операций, когда нужна тонкая настройка SQL или batch-обработка.
  • Redis интегрирую через Spring Data Redis для кэширования и хранения сессий.

Проблемы с @Transactional:

  • Прокси и вызовы внутри класса: если метод с @Transactional вызывается из другого метода того же класса напрямую, транзакция не создаётся, так как Spring использует прокси. Решение — выносить транзакционные методы в отдельный бин или использовать AspectJ.

  • Rollback по checked исключениям: по умолчанию транзакция откатывается только при unchecked исключениях (RuntimeException). Для rollback по checked исключениям нужно явно указать rollbackFor.

  • Нестандартные propagation: иногда сложно правильно выбрать propagation (например, REQUIRES_NEW), чтобы избежать проблем с вложенными транзакциями.

Пример:

@Service
public class UserService {

    @Transactional
    public void createUser(User user) {
        userRepository.save(user);
        // если здесь выбросить checked исключение, транзакция не откатится без rollbackFor
    }

    @Transactional(rollbackFor = Exception.class)
    public void createUserWithRollback(User user) throws Exception {
        userRepository.save(user);
        throw new Exception("Force rollback");
    }
}

В целом, важно понимать, как Spring управляет транзакциями и какие ограничения накладывает прокси-механизм.