이런 경우가 있음


엔티티를 가져와

그사이에 다른 트랜잭션에서 그 엔티티 변경하고 커밋해

이때

엔티티를 다시 가져올경우에 그냥 영속성 컨텍스트에 있는거 가져다쓴다. 여기까진 쉬워

근데 문제는

벌크성으로 가져왔는데 해당 엔티티가 섞여있을 경우는 어떨까?

이 경우에 분명히 해당 엔티티의 변경된 데이터가 쿼리에 섞여 들어와.

이때 JPA는 엔티티를 업데이트할까?

정답은 안한다야.

근데 이게 당연한데? 직관적인데? 라고 받아들이면 안돼

가장 만든사람이 편하게 만드는 방법은
벌크성으로 엔티티를 100개를 만드는 로직에 예외를 두지 않는거야.

근데 JPA는 예외적으로 해당 엔티티가 이미 존재할경우 그걸 안만드는거야.

일부러 예전걸 보여주는거라고.



그니까 보통 국룰은

데이터베이스는 Read Comitted
그리고 JPA에서 영속성 컨텍스트를 사용하는건데

영속성 컨텍스트는 Read Committed를 무시하고
자체적으로 1차캐쉬를 통해서 Read Repeatable 비스무리한걸 구현하는 그런녀석임.


근데 이 컨셉을 유지하고자
일부러 신규 정보를 소실시키고 옛날 정보를 유지시켜주는거임.


그러면 이런 문제가 생김.


만약에 엔티티를 만드는 쿼리가 아니라
그 내부데이터를 사용해서 where 절을 걸어야하는 경우는 어떻게 될까?

이 경우에도 맘편히

아 JPA는 Read Repeatable이랑께 할수있을까?

내부데이터는 다 갱신된다

DB 쿼리는 read committed니까 다 갱신됨.




이해 안가면 걍 이거만 알려줄게.

1.엔티티 가져왔어

2. 바꾸고 커밋했어

3. 해당 엔티티의 name 필드만 쿼리해와서 String으로 저장했어

4. 100개의 엔티티를 벌크성으로 쿼리해오고 List<Entity> 로 만들었어

5. 리스트에서 해당 엔티티를 찾아서 name 필드에 접근해서 저장했어



여기서 3번과 5번의 데이터가 다르다


3번은 갱신된거

5번은 옛날거 가져온다


2번시점 이후로 DB상태 동일한데도


두 쿼리가 가져오는 데이터 값이 다르다


5번의 경우는 갱신된걸 가져와야하는 경우인데 일부러 JPA 컨셉 유지시키기 위해 옛날 엔티티를 갱신안하고 그대로 냅둔 케이스임.