Вступить в клуб →
средняявопросSpring Boot и REST API

@Transactional не срабатывает при вызове метода внутри того же класса

Импорт данных должен сохранять каждую строку в отдельной транзакции, чтобы одна плохая запись не отменяла весь пакет:

@Service
public class ImportService {

    public void importAll(List<Row> rows) {
        for (Row row : rows) {
            saveRow(row);
        }
    }

    @Transactional
    public void saveRow(Row row) {
        repository.save(row);
        auditRepository.save(new Audit(row));
    }
}

Тесты показывают, что при ошибке в середине пакета данные ведут себя не так, как задумано. Что здесь не работает?

  • Всё работает как задумано: каждая строка сохраняется в отдельной транзакции сервисного слоя
  • Аннотацию нужно перенести на метод репозитория: на сервисном слое @Transactional игнорируется
  • Все строки попадут в одну общую транзакцию, которая откроется на importAll и откатится целиком
  • Вызов saveRow идёт напрямую внутри объекта, минуя прокси Spring, поэтому транзакция не открывается вовсе

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела