是CrudRepository.save(Iterable <s>)是原子的吗?

时间:2019-05-27 10:34:10

标签: java spring hibernate spring-data-jpa spring-data

我正在使用CrudRepository.save(Iterable<S>)保存多个对象。

此操作行为是否是原子操作?

如果我保存10个实体而第六个实体失败,会发生什么?

3 个答案:

答案 0 :(得分:1)

根据documentation,saveAll的外观如下:

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

但是,要确保它可以作为单个原子事务工作,您需要:

1)确保交易支持为您服务

2)确保将autocommit设置为false(可选,以防无法工作)

答案 1 :(得分:0)

是的,这是原子的。 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;
    }
}

答案 2 :(得分:0)

在可见的情况下,这就是使用迭代器的SimpleJpaRepository保存方法发生的情况

@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 Refer changes了解详情

  

如果我保存10个实体而第六个实体失败,会发生什么?

默认情况下,CrudRespository将具有@Transactional,因此在例外情况下不会保存任何内容。

在手动处理的情况下,它将起作用

如果您正在执行此类操作,则会回滚。

@Transactional(rollbackFor=RuntimeException.class)
public List<Car> saveAllOrNone(List<Car> cars) {
    for(Car car: cars) {
        repo.save(car);
    }
}