我想坚持使用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,因此没有版本冲突。基本上,您必须在其他人可以再次阅读和更改之前回信。
您是否检查了列表中的实体是唯一的?