@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, поэтому транзакция не открывается вовсе
