FlushModeType.COMMIT (12:45) 예시코드 질문
55
投稿した質問数 4
안녕하세요,
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 모드는 확실한 이해 하에 사용하라는 것은 확실히 이해했습니다! 다만 예시코드 보다가 급 궁금해져서요ㅎㅎ
回答 1
1
안녕하세요 좋은 질문 감사합니다!
오 넵 말씀하신 대로 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
11
1
13강 [로그인 단일 토큰] 에서 프로젝트 실행 시 에러
0
15
1
11강 [실습] Docker로 MySQL1 분만에 실행하기
0
20
2
11강 [실습] Docker로 MySQL1 분만에 실행하기
0
19
2
6분46초
0
25
2
공략법
0
25
1
isInterrupted 질문 있다.
0
18
1
구현 방법에 대한 문의
0
30
2
fieldInjectionTest() 질문
0
29
1
선생님 샤딩에 대한 강의도 좀 해주세요
0
29
1
몽고DB CAP 이론 관련
0
43
2
AutoAppConfig의 존재이유
0
34
1
모의고사 파일과 이론파일 업데이트
0
54
2
장애 격리 관련해서 궁금한 부분이 있어요
0
37
1
이론 pdf 다운은 어디서 하나요?
0
50
2
RunIdIncrementer batch 5랑 6랑
1
43
2
AppConfig와 스프링 빈 질문
0
38
1
질문있습니다.
0
36
1
15분 35초즈음 나오는 500개 단위로 쪼개는 경우 스레드 질문
0
30
1
강의 자료를 받아볼 순 없겠나
1
56
2
수업이 안보여요
0
53
1
MSA 통신방식에 대해서 질문 있습니다.
0
39
1
코테의 바이블 수강생 코테올인원 JAVA 쿠폰
0
38
1
자막 오타 제보
0
64
1

