0

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() 낙관적 인 잠금 예외가 발생입니까? 가리키는

+0

두 번째 방법은 여전히 ​​병렬 스트림을 사용합니다. 처음에는 컴파일 오류가 있습니다. – Holger

+0

@Holger 매우 유감스럽게도 타이핑 실수였습니다. 나는 그것을 바로 잡았다 – Lakshi

답변

0

구글은 "낙관적 잠금"을 생산하는 즉시 대답, this question에 :

낙관적 잠금 당신이 레코드를 읽을 전략이다이 날짜를 포함, 할 다른 방법 버전 번호를 기록 (받아 , 타임 스탬프 또는 체크섬/해시)을 확인하고 레코드를 다시 작성하기 전에 버전이 변경되지 않았는지 확인하십시오.

목록이 두 번 같은 항목이 포함되어있는 경우

, 그것은 다음 번 합병, 두 번째 시간을 병합 할 때 예외가 발생, 두 번 병렬로 읽을 수 있습니다. 병렬 스트림없이이 작업을 수행하는 경우 읽기 - 쓰기 - 읽기 - 쓰기가 가능하므로 버전 충돌이 없습니다. 기본적으로 다른 사람이 읽고 다시 읽을 수 있기 전에 다시 쓰지 않으면 안됩니다.

목록의 항목이 고유하다는 점을 확인 했습니까?

+0

예! 나는 확인했다. 그들은 독특합니다. 그게 내가 궁금해하는 이유. 각 엔티티가 고유 한 ID를 가진 데이터 테이블에서 엔티티를 가져옵니다. – Lakshi

+0

해당 엔티티는 링크 된 속성을 공유합니까? 예외가 정확히 오류가 발생하는 위치에 대해 아무 것도 표시합니까? –

+0

예. 그들은 관계형 1 대 1 엔티티가 있지만 고유합니다. 교차하지 않는 관계 – Lakshi