错误使用Java并行流持续存在实体列表



我想坚持使用JPA的实体列表。我的第一种方法如下:

List<myEntity>entityList=myService.getMyEntities();`
\some other activities...`
entityList.parallelStream().forEach(l->l.setMyStatus(MyStatus.newStatus);
entityList.parallelStream().forEach(l->myService.getEntityManager().merge(l));

但是我得到了一个OpportisticLockexception。

我的第二种方法是使用流而不是平行流。

entityList.stream().forEach(l->myService.getEntityManager().merge(l));

第二种方法有效!现在我的问题是为什么ParallelStream()会导致乐观的锁定异常?

Google在"乐观锁定"上产生的即时答案,指向此问题:

乐观的锁定是一种策略,您可以阅读记录,记下版本号(执行此操作的其他方法涉及日期,时间戳或校验和hashess/hashes)并检查该版本是否在您写回记录之前没有更改。

如果您的列表包含两次相同的条目,则可以并行两次,然后合并一次,第二次合并异常时。如果您在没有平行流的情况下这样做,则可以阅读Write-Read-Write,因此没有版本冲突。基本上,您必须在其他人可以再次阅读和更改之前回信。

您是否检查了列表中的实体是唯一的?

最新更新