@Test
void test1() throws InterruptedException {
int threadCount = 100;
ExecutorService executorService = Executors.newFixedThreadPool(32);
CountDownLatch countDownLatch = new CountDownLatch(threadCount);
List<Member> memberList = new ArrayList<>();
for(int i =0; i<100; i++){
String email = "user"+i+"@email.com";
String nickName = "user"+i;
memberList.add(new Member(email, nickName, Role.ROLE_USER, null));
}
List<Member> members = memberRepository.saveAll(memberList);
TestTransaction.flagForCommit();
TestTransaction.end();
for (int i = 0; i < threadCount; i++) {
int index = i;
executorService.submit(() -> {
try{
Member member = members.get(index);
bookmarkService.createBookMark(member.getEmail(), bin1.getId());
} finally {
System.out.println("북마크"+index);
countDownLatch.countDown();
}
}
);
}
countDownLatch.await();
System.out.println("북마크 숫자: " + bin1.getBookmarkCount());
deleteData();
}
일단 멀티 스레드 처리를 차지하고서라도 위 코드에서 bookmark 숫자는 최소 1이상은 돼야 한다.

하지만, 위 사진처럼 계속 북마크가 0이라고 떴다.
이전 글에서 멀티 스레드 환경에선 스레드마다 새로운 트랜잭션이 생겨서 영속성 컨텍스트도 달라진다고 말했다.
즉, 여기서도 동일한 문제가 발생하고 있는 것으로 보인다. 1차 캐시에 업데이트된 북마크가 반영이 안 된 것으로 보인다.
}
private <T> void checkEntityInCache(Class<T> entityClass) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery(entityClass);
Root<T> root = cq.from(entityClass);
cq.select(root);
List<T> results = entityManager.createQuery(cq).getResultList();
}

그래서, 1차캐시를 가져와서 확인해봤다. 역시 트랜잭션끼리 데이터가 동기화가 안 된 것으로 보인다.
그래서 엔티티매니저로 캐시를 지우고 DB에서 값을 조회하도록 했다.


동시성 이슈때문에 100L까지는 되지 않았다(이건 따로 처리해줘야 한다)
대신 북마크 카운트가 올라간 것은 볼 수 있다.
영속성 컨텍스트에서도 DB의 최신 내역이 반영돼 있다.