이 글은 인프런 '재고시스템으로 알아보는 동시성이슈 해결방법' 강의를 듣고 작성한 글입니다.
현재 위치 : 4강 5분대
save 메소드는 자주 사용하는데, saveAndFlush 메소드는 친숙하지 않아 제대로 알기 위함.
Spring을 공부하면 한번쯤은 영속성 컨텍스트(persistence context)에 대해 들어보았을 것이다.
영속성 컨텍스트에 대해 설명하면 한없이 길어지니 간단하게 줄이자면
데이터 변경 사항을 메모리(1차 캐시)에 들고있다가, commit/flush 후 DB에 반영하는 구조로 아래와 같은 이점들이 있다.
한마디로 save를 실행한다 해서 바로 DB로 가는게 아니라, commit/flush 메소드가 있어야 쓰기 지연 SQL이 한꺼번에 실행되며 실제 insert가 일어난다는 소리
@Transactional 이 없는 경우
동일함
@Transactional이 있는 경우
save -> 영속성 컨텍스트에만 저장, @Transactional 종료 후 쓰기 지연 SQL에 저장, DB에 반영
saveAndFlush -> 쓰기 지연 SQL까지 저장, @Transactional 종료 후 DB 반영
따라서 saveAndFlush를 쓰면 바로 read를 해도 새 데이터를 읽어올 수 있다.
save는 read를 바로 하면 새 데이터가 반영되지 않는다.
다만 두 경우 모두 실제 DB에 반영된 것이 아니라 쓰기 지연 SQL에 저장 된 상태이므로, 외부에서는 새 데이터를 조회할 수 없다. @Transactional 종료 후 실제 DB에 반영 되어야 외부에서 읽을 수 있다.
https://www.baeldung.com/spring-data-jpa-save-saveandflush
https://ramees.tistory.com/36