728x90

✅ 1. 커밋(COMMIT) / 롤백(ROLLBACK) 시점에 어떤 일이 일어나는지

⚾️ 먼저 개념부터 짚자:

  • 커밋 (Commit): 트랜잭션 안에서 한 작업들을 DB에 영구 반영하겠다는 뜻
  • 롤백 (Rollback): 트랜잭션 안에서 한 작업들을 전부 취소하고 원래대로 되돌리겠다는 뜻

 

 


🔍 JPA에서 커밋이 일어날 때 무슨 일이 벌어지나?

JPA는 EntityManager 내부의 1차 캐시(Persistence Context)에서 객체 상태를 추적하고 있다가, 트랜잭션이 끝날 때 flush()를 자동으로 호출해!
변경된 내용이 SQL로 변환되어 DB에 반영

👉 예:

@Transactional
public void updateTitle(Long id) {
    Post post = postRepository.findById(id).orElseThrow();
    post.setTitle("새로운 제목");
    // 아직 DB 반영 아님. 메모리 상 객체만 수정한 상태

    // 메서드 끝 → 트랜잭션 커밋 시 flush() → DB에 UPDATE 쿼리 실행됨
}

결과:

UPDATE post SET title='새로운 제목' WHERE id=?

 

 


🧨 예외가 발생해서 롤백된다면?

@Transactional
public void errorCase(Long id) {
    Post post = postRepository.findById(id).orElseThrow();
    post.setTitle("실패 케이스");

    // 문제 발생!
    throw new RuntimeException("강제 오류!");
}

이 경우:

  • flush() 실행 X
  • DB에 UPDATE 쿼리도 날리지 않음
  • 메모리에서만 바뀌고 DB는 그대로

 

 


✅ 2. flush() 랑 커밋의 차이는?

  • flush()영속성 컨텍스트(1차 캐시)의 변경 내용을 SQL로 DB에 보냄
  • 하지만! 커밋은 그걸 영구히 저장하고, 롤백은 무효화하는 것
구분 flush() commit
언제 호출? 트랜잭션 중간에도 수동 호출 가능 트랜잭션 끝날 때 자동
역할 SQL만 실행 (DB에 반영 시도) DB에 영구 반영
확정 여부 아직 아님 확정임
롤백 가능? 가능 불가 (이미 반영됨)

✔️ flush만으로는 저장 확정이 아님.

→ flush 후 롤백하면 실제 DB에는 아무 일도 안 생긴 거처럼 됨.

 

 


✅ 3. 트랜잭션 없이 JPA 쓰면 어떻게 되는데?

public void noTransactionUpdate() {
    Post post = postRepository.findById(1L).orElseThrow();
    post.setTitle("트랜잭션 없음");

    // 트랜잭션 없으니 flush도 안 되고
    // 변경 감지 기능도 작동 안 함!
}

❗ 무슨 일이 벌어지냐면:

  • post.setTitle("변경") 했는데도, DB에는 아무 일도 일어나지 않아
  • 변경 감지(Dirty Checking)가 동작 안 해!
  • 결국 JPA는 "아 얘 그냥 값 바꾼 것뿐인가보다" 하고 무시함

🔥 결론:

JPA를 쓰려면 반드시 트랜잭션 안에서 사용해야 한다!

 

 


🎯 정리 요약

기능 설명
커밋 트랜잭션의 변경 사항을 DB에 영구 반영
롤백 트랜잭션의 모든 작업을 취소
flush 1차 캐시에 있는 변경 사항을 DB에 SQL로 보냄 (하지만 확정은 아님)
트랜잭션 없으면? 변경 감지, 쓰기 지연 등 JPA의 핵심 기능이 작동 안 함

 

 


🔹 지금까지 배운 핵심 요약 (트랜잭션 관련)

구분 의미와역할
flush() 변경된 엔티티 정보를 SQL로 변환해서 DB에 전달. 하지만 실제 저장은 아님
commit flush된 SQL을 진짜 DB에 영구 반영함. 이 시점에서 저장 완료됨
rollback flush가 되었더라도 모든 변경사항을 취소함. DB에는 아무 일도 없었던 것처럼 됨
트랜잭션 없이 사용 JPA의 핵심 기능 (변경 감지, 쓰기 지연 등)이 작동하지 않음

 

728x90