엔티티 등록
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
trnasaction.begin();
em.persist(memberA);
em.persist(memberB);
transaction.commit(); 드랜잭션 커밋
쓰기 지연, 회원 A 영속 |
---|
|
- 커밋 직전까지 내부 쿼리 저장소에 INSERT SQL을 모아둔다.
- 커밋할 때 모아둔 쿼리를 DB에 보낸다.
- 이것을 transactional write-behind(트랜잭션을 지원하는 쓰기 지연)이라 한다.
- 회원 A가 이미 영속화했고, 영속성 컨텍스트는 1차 캐시에 회원 엔티티를 저장
- 동시에 등록 쿼리(INSERT SQL)를 만든다.
- 만들어진 등록 쿼리를 쓰지 지연 SQL 저장소에 보관
쓰기 지연, 회원 B 영속 |
---|
|
- 회원 B가 영속화했고, 마찬가지로 회원 엔티티 정보로 등록 쿼리를 생성해서 쓰기 지연 SQL 저장소에 보관
- 현재 쓰기 지연 SQL 저장소에는 등록 쿼리가 2건 저장 되어있다.
쓰기 지연, 커밋 |
---|
|
- 트랜잭션을 커밋 하게되면
- 엔티티 매니저는 우선 영속성 컨텍스트를 플러시
- 플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화하는 작업
- 이때 등록, 수정, 삭제한 엔티티를 데이터베이스에 반영
- 쓰기 지연 SQL 저장소에 모인 쿼리를 데이터베이스에 보낸다.
- 이렇게 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화한 후 커밋한다.