Является ли CrudRepository.save (Iterable <S>) атомарным? - PullRequest
1 голос
/ 27 мая 2019

Я сохраняю несколько объектов, используя CrudRepository.save(Iterable<S>).

Является ли это поведение операции атомарным?

Что произойдет, если я сохраню 10 объектов и произойдет сбой 6-го объекта?

Ответы [ 3 ]

1 голос
/ 27 мая 2019

Согласно документации вот как выглядит saveAll:

@Transactional
public <S extends T> List<S> saveAll(Iterable<S> entities)

Но, чтобы убедиться, что она будет работать как одна атомарная транзакция, вам нужно:

1) Убедитесь, что поддержка транзакций работает для вас

2) Убедитесь, что для автоматической фиксации установлено значение false (необязательно, если не будет работать)

0 голосов
/ 27 мая 2019

Позади видно, что происходит в случае SimpleJpaRepository метода сохранения с Iterable

@Transactional
public <S extends T> List<S> More save(Iterable<S> entities) {

    List<S> result = new ArrayList<S>();

    if (entities == null) {
        return result;
    }

    for (S entity : entities) {
        result.add(save(entity));
    }

    return result;
}

Стоит отметить, что сохранение с Iterable было изменено на saveAll в последних версиях Подробнее см.

Что произойдет, если я сохраню 10 сущностей, а для 6-й не получится?

По умолчанию CrudRespository будет иметь @Transactional, поэтому в случае исключения ничего не сохраняется.

В случае обработки вручную это будет работать

Если вы делаете что-то подобное, это будет откатом.

@Transactional(rollbackFor=RuntimeException.class)
public List<Car> saveAllOrNone(List<Car> cars) {
    for(Car car: cars) {
        repo.save(car);
    }
}
0 голосов
/ 27 мая 2019

Да, это атомно. SimpleJpaRepository является реализацией по умолчанию для интерфейса CrudRepository. Метод save помечается Transactional при реализации. Так что в случае любой ошибки все будет откатано.

@Transactional
public <S extends T> List<S> save(Iterable<S> entities) {
    List<S> result = new ArrayList();
    if (entities == null) {
        return result;
    } else {
        Iterator var3 = entities.iterator();

        while(var3.hasNext()) {
            S entity = var3.next();
            result.add(this.save(entity));
        }

        return result;
    }
}
...