错误持续使用java并行数据流的实体列表
问题描述:
我想使用JPA持久化一个实体列表。我的第一种方法如下:错误持续使用java并行数据流的实体列表
List<myEntity>entityList=myService.getMyEntities();`
\\some other activities...`
entityList.parallelStream().forEach(l->l.setMyStatus(MyStatus.newStatus);
entityList.parallelStream().forEach(l->myService.getEntityManager().merge(l));
但我得到了一个OptimisticLockException。
我的第二种方法是使用流而不是并行流。
entityList.stream().forEach(l->myService.getEntityManager().merge(l));
第二种方法可行!现在我的问题是为什么parallelStream()会导致乐观锁定异常?
答
最直接的答案谷歌的“乐观锁定”产生,指着this question:
乐观锁是你读取记录的策略,注意版本号的(其他的方法来做到这一点涉及日期,时间戳或校验和/散列),并在写回记录之前检查版本是否未更改。
如果您的列表包含两次相同的条目,它可能会被并行读取两次,然后合并一次,并在第二次合并时引发异常。如果你没有并行数据流,你就可以读写,并且没有版本冲突。基本上,您必须在别人可以阅读并再次更改之前回写。
你是否检查过列表中的实体是唯一的?
你的第二种方法仍然使用并行流。你的第一个包含编译错误。 – Holger
@Holger很抱歉这是一个输入错误。我纠正了它 – Lakshi