FlushModeType.COMMIT (12:45) 예시코드 질문
21
작성한 질문수 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 모드는 여전히 데이터 정합성 측면에서 주의가 필요할 것 같습니다!!! 깊은 질문 감사드립니다
4강 카드뉴스 자동화 자료
0
19
0
내부 객체 직접 접근에 관하여.
0
18
1
라이브 강의 영상 녹화본이 있을까요?
0
32
1
presentation error
0
16
1
인증이 늦었습니다ㅜㅜ 확인부탁드립니다
0
39
1
9월 8일 세션 진행한 거는 없었을까요
0
29
1
CertificationServiceTest
0
25
1
미션1 진행방법 관련
1
29
1
클로드코드 명령어 - 대화&세션관리부분 강의자료 빈폴더
0
29
1
Spock given and가 검증을 하는지
0
23
1
9번 강의 save 메서드 질문
0
29
1
Issuance 테이블에 status, couponId 인덱스가 꼭 필요할까요?
2
40
1
readme에 대한 자료는 따로 받아볼수 있나요?
0
39
2
11강 따라하는중에 오류가 발생해서 문의드립니다.
0
34
1
InvalidCurriculumException DIP 적용 여부 문의
0
30
1
ProductController 에서 타협하지 않는다면 어떤 형태가 되나요?
1
39
2
섹션2, 대화&세션관리 수업 자료 누락
0
40
2
영상 다운로드는 안되나요?
0
48
1
IntelliJ IDEA 체험 만료
0
50
2
부하 테스트 시 설정 관련 질문드립니다
1
70
2
HelloSpringApplication.java 클래스 실행 오류
0
47
1
build 시 에러 해결방법 공유(docker.desktop 업데이트 -> 의존성 버전 수정)
0
65
2
예외처리 3강 문의
0
58
1
자막 오타 제보
0
57
1





