我正在使用CrudRepository.save(Iterable<S>)
保存多个对象。
此操作行为是否是原子操作?
如果我保存10个实体而第六个实体失败,会发生什么?
答案 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);
}
}