한 객체에 대해 여러 번 꺼내도 값들은 모두 같다는 것을 보장함
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin(); // 동일성 보장 확인
Member findMember1 = em.find(Member.class, 100L); //SQL로 가져옴
Member findMember2 = em.find(Member.class, 100L); // 캐시된 값을 가져옴
System.out.println("result = " + (findMember1 == findMember2)); // "result = true"
tx.commit();
em.close();
emf.close();
}
INSERT
Entity를 저장 한다고 해서 DB에 쿼리가 바로 전송 되는 것이 아닌 트랜잭션이 commit 할 때 까지 INSERT SQL을 모아놓고 JDBC BATCH SQL 기능을 사용해서 SQL을 한번에 전송함
transaction.begin(); //트랙잭션 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// INSERT SQL을 DB에 보내지 않음
transaction.commit(); // 커밋하는 순간 INSERT SQL을 DB에 한번에 보냄
UPDATE
UPDATE, DELETE로 인한 ROW락 시간 최소화
트랜잭션 commit 발생 시 UPDATE, DELETE SQL을 실행하고 바로 commit
transaction.begin(); //트랙잭션 시작
changeMember(memberA);
deleteMemver(memberB);
비즈니스_로직(); //비즈니스 로직 수행 동안 DB로우 락이 걸리지 않음
transaction.commit(); // 커밋하는 순간 UPDATE, DELETE SQL을 DB에 한번에 보냄