inflearn logo
강의

Course

Instructor

[Lv2] A Complete Guide to JPA for Professional Developers — From the Persistence Context to Practical Patterns

2-3. 🚽 Flush: Synchronizing the persistence context at the "moment the water goes down"

FlushModeType.COMMIT (12:45) 예시코드 질문

66

stillonmyway

4 asked

0

안녕하세요,

FlushModeType.COMMIT에 대한 부작용으로 기재하신 예시코드 관련 질문 드립니다.

em.setFlushMode(FlushModeType.COMMIT);

// 1. 회원 A 저장
em.persist(new Member("회원A")); 

// 2. 회원 조회 (JPQL)
// 플러시가 안 일어남 -> DB에는 '회원A'가 없음 -> 조회 결과 0건
List<Member> list = 
    em.createQuery("select m from Member m where m.name = '회원A'", Member.class)
      .getResultList();

// 결과: 방금 저장했는데 조회가 안 되는 미스터리 발생 😱

만약 Member 엔티티 클래스의 ID 생성 전략이 IDENTITY인 경우

em.persist(new Member("회원A")); 에 의해 INSERT 쿼리가 실행되므로, 그 아래 코드에서는 해당 데이터가 조회되지 않나요?

데이터 불일치 문제가 발생할 수 있으니 COMMIT 모드는 확실한 이해 하에 사용하라는 것은 확실히 이해했습니다! 다만 예시코드 보다가 급 궁금해져서요ㅎㅎ

java spring spring-boot jpa spring-jpa

Answer 1

1

dingcodingco

안녕하세요 좋은 질문 감사합니다!

오 넵 말씀하신 대로 ID 생성 전략이 IDENTITY라면 em.persist(new Member("회원A")) 시점에 INSERT 쿼리가 바로 실행됩니다. 그래서 그 아래 JPQL 조회에서는 DB에 이미 데이터가 있으므로 조회가 됩니다!
강의 예시는 IDENTITY가 아닌 SEQUENCE 전략을 기준으로 설명한 것입니다. SEQUENCE 전략은 persist 시점에 ID만 먼저 가져오고 INSERT는 쓰기 지연 SQL 저장소에 쌓아두기 때문에, FlushModeType.COMMIT으로 플러시를 막아두면 JPQL 실행 전에 INSERT가 나가지 않아 조회 결과가 0건이 됩니다.
즉 IDENTITY 전략에서는 persist 자체가 즉시 INSERT를 유발하므로 COMMIT 모드의 부작용이 드러나지 않을 수 있습니다. 다만 IDENTITY여도 이후 변경 감지로 인한 UPDATE는 커밋 전까지 지연될 수 있으니, COMMIT 모드는 여전히 데이터 정합성 측면에서 주의가 필요할 것 같습니다!!! 깊은 질문 감사드립니다

런타임 에러

0

6

0

서브넷 마스크

0

9

1

상세 설정까지 이해하시는 비결이 궁금합니다

1

21

2

claude api 크레딧

0

12

0

모의고사 1회 계산문제 2개 맞았는데

0

18

1

서비스에서와 컨트롤러의 @Vaild 적용 차이에 대해서

0

20

2

Apple Silicon에서 CI 빌드 이미지가 재시작을 반복할 때 (jib platforms 수정)

1

29

1

제공된 스크립트를 어디서 받을 수 있나요?

0

17

0

업캐스팅 문제 예시 4번 부모 호출

0

26

1

해결했습니다

0

27

1

copilot-instruction.md

0

15

1

미션 제출 방식 건의

0

23

0

강의 슬라이드 자료

1

34

2

트랜잭션 내 Redis I/O 에 대한 궁금한점

1

23

1

모의고사 자료 해설이 너무 불친절하네요.

0

60

2

부모의 생성자 출력 관련

0

26

2

이론파트 재탕문제

0

27

0

누락코드

0

29

1

다차원 배열 포인터 질문있습니다

0

49

3

미션 진행 방식에 대한 질문입니다.

0

43

1

이론 파트 재탕

0

40

1

모의고사 5회

0

38

1

12분 10초 func(values, 0, 1)을 넣을 때

0

39

1

자막 오타 제보

0

77

1