inflearn logo
강의

Khóa học

Chia sẻ kiến thức

[Lv2] Chinh phục hoàn toàn JPA dành cho lập trình viên thực chiến - Từ ngữ cảnh bền vững đến các mẫu thực tiễn

2-3. 🚽 Flush: Đồng bộ hóa ngữ cảnh bền vững tại "thời điểm xả nước"

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

55

stillonmyway

4 câu hỏi đã được viết

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

Câu trả lời 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 모드는 여전히 데이터 정합성 측면에서 주의가 필요할 것 같습니다!!! 깊은 질문 감사드립니다

postgresql 인텔리제이 커뮤니케이션 버전에서는 실행 안되나요?

0

1

0

movablePageCount와 pageSize 상수

0

4

1

JPA와 네이티브 쿼리

0

5

1

aws 계정 생성 질문

1

16

1

Tasklet 배치 관련 내용

0

11

1

조회 메서드 네이밍 질문

0

28

1

소스파일

0

30

1

강의 판서 자료

0

27

2

모의고사 파일오류

0

57

3

Properties 설정이 추가되었는데

0

27

1

아무 수정도 안하고 주어진 소스로 그대로 했는데 패스워드 에러가 남

0

48

1

[환불 승인 요청] 강의 오결제 및 재구매 관련 문의드립니다.

0

38

1

처음 실행 시 계속 패스워드가 틀리다고 나옴. 수정하고 해도 마찬가지임

1

59

2

모의고사 다운

0

42

1

22강 [토큰 저장] 질문

0

42

1

업캐스팅 원칙

0

56

2

음성불량

0

41

1

13강 [로그인 단일 토큰] 에서 프로젝트 실행 시 에러

0

38

1

11강 [실습] Docker로 MySQL1 분만에 실행하기

0

61

2

11강 [실습] Docker로 MySQL1 분만에 실행하기

0

51

2

6분46초

0

51

2

공략법

0

54

1

isInterrupted 질문 있다.

0

29

1

자막 오타 제보

0

67

1