• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

플러시 관련 질문

23.04.24 21:42 작성 23.04.24 21:43 수정 조회수 264

0

영상에서 보면 플러시가 영속성 컨텍스트에 있는 1차 캐시 정보를 토대로 SQL 쓰기 지연 저장소 내용을 데이터베이스에 반영한다고 말씀해주셨습니다. 그리고 커밋되는 시점에 플러시가 자동으로 반영된다고도 말씀해주셨는데요,

그런데 아래 코드를 보면 강제로 플러시를 한번 호출하고 커밋을 반영해서 플러시를 결과적으로 두번 호출한 꼴이 될텐데 왜 데이터베이스에는 데이터가 두개가 아니라 한개만 반영되어 들어간건가요?

Member member = new Member(3L, "TEST_JPA");
em.persist(member);
em.flush();
tx.commit();

답변 1

답변을 작성해보세요.

0

OMG님의 프로필

OMG

2023.04.29

안녕하세요. 펭귄님, 공식 서포터즈 OMG입니다.
.

트랜잭션의 커밋과 롤백에 대해 생각하면 좋을 것 같습니다. 실제 트랜잭션을 반영하는 것은 커밋, 취소하는 것은 롤백입니다.

flush와 commit 모두 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하지만, 트랜잭션을 종료하는 것은 commit() 메서드입니다. 그래서 코드에서 데이터가 두 번 저장되지 않고, 한 번만 저장됩니다.
.
감사합니다.

펭귄님의 프로필

펭귄

2023.04.29

음 그럼 flush 의 역할이 호출될 때마다 insert 쿼리를 날려서 db에 반영시키는게 아니라

최초로 한번 insert 날리고나서 영속성 컨텍스트에 변경 내용이 있을 때마다 db에 반영시켜주는건가요??