JPA 영속성 컨텍스트 - 등록

Daniel6364·2022년 8월 2일
0

엔티티 등록

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();

//엔티티 매니저는 데이터 변경 시 트랜잭션을 시작해야 한다.
trnasaction.begin(); // 트랜잭션 시작

em.persist(memberA);
em.persist(memberB);
// 여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.

//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); 드랜잭션 커밋

쓰기 지연, 회원 A 영속
  • 커밋 직전까지 내부 쿼리 저장소에 INSERT SQL을 모아둔다.
  • 커밋할 때 모아둔 쿼리를 DB에 보낸다.
  • 이것을 transactional write-behind(트랜잭션을 지원하는 쓰기 지연)이라 한다.
  • 회원 A가 이미 영속화했고, 영속성 컨텍스트는 1차 캐시에 회원 엔티티를 저장
  • 동시에 등록 쿼리(INSERT SQL)를 만든다.
  • 만들어진 등록 쿼리를 쓰지 지연 SQL 저장소에 보관

쓰기 지연, 회원 B 영속
  • 회원 B가 영속화했고, 마찬가지로 회원 엔티티 정보로 등록 쿼리를 생성해서 쓰기 지연 SQL 저장소에 보관
  • 현재 쓰기 지연 SQL 저장소에는 등록 쿼리가 2건 저장 되어있다.

쓰기 지연, 커밋
  • 트랜잭션을 커밋 하게되면
  • 엔티티 매니저는 우선 영속성 컨텍스트를 플러시
    • 플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화하는 작업
  • 이때 등록, 수정, 삭제한 엔티티를 데이터베이스에 반영
    • 쓰기 지연 SQL 저장소에 모인 쿼리를 데이터베이스에 보낸다.
  • 이렇게 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화한 후 커밋한다.
profile
The Office Lover

0개의 댓글