일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- OS
- CSS
- CS
- jpa
- nosql
- javascript
- 백준
- java
- PYTHON
- 자료구조
- redis
- BFS
- It
- Algorithm
- 트랜잭션
- Docker
- 영속성 컨텍스트
- websocket
- 알고리즘
- 운영체제
- db
- Data structure
- spring
- 완전탐색
- 플로이드-워셜 알고리즘
- 데이터베이스
- DFS
- 프로그래머스
- mysql
- HTML
- Today
- Total
If at first you don't succeed, try again
[JPA] Flush와 Commit의 차이 본문
* 개요
JPA를 공부하다 보니, flush와 commit에 대한 개념이 너무 헷갈렸다.
두 개의 작업은 데이터를 데이터베이스에 반영한다는 점에서는 비슷하지만 엄연히 다르다고 한다.
이를 정리하기 위해 글을 쓰게 되었다.
* flush()란?
flush()는 영속성 컨텍스트의 변경사항을 즉시 데이터베이스에 반영(동기화)하는 역할을 한다.
즉, 데이터베이스와 영속성 컨텍스트 사이의 스냅샷을 일치시키는 작업이다.
- 스냅샷 : 엔티티를 영속성 컨텍스트에 보관할 때, 최초 상태를 복사해서 저장해두는 것
다만, 트랜잭션을 커밋하지는 않는다.
이는 에러 발생 시, ROLLBACK이 가능한 단계까지만 반영하는 작업임을 알 수 있다.
그리고 flush()가 호출되면 변경된 엔티티가 SQL로 변환되어 실행되지만, 트랜잭션이 끝난 것은 아니다.
entityManager.persist(entity);
entityManager.flush(); // SQL 쿼리 즉시 실행
- 그래서 flush()는 언제 사용하는데?
-> 변경 사항을 즉시 데이터베이스에 반영해야 하지만, 트랜잭션은 유지해야 할 때 사용(대량 데이터 처리)
-> JPQL 실행 전에 변경 사항을 강제 반영해야 할 때 사용
* commit()이란?
commit()은 현재 트랜잭션을 완료하고 모든 변경 사항을 확정하는 역할을 한다.
내부적으로 flush()를 수행한 후, 실제로 트랜잭션을 커밋한다.
commit()이 실행되면 변경 사항이 영구적으로 저장되며 ROLLBACK할 수 없다.
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
entityManager.persist(entity);
transaction.commit(); // flush()가 자동 실행된 후 commit됨
- 그래서 commit()은 언제 사용하는데?
-> 데이터베이스 변경 사항을 최종적으로 확정할 때 사용
-> 하나의 작업 단위를 끝내고 안정적인 저장이 필요할 때 사용
* 결론
구분 | flush() | commit() |
실행 시점 | 즉시 데이터베이스에 SQL 실행 | 트랜잭션 종료 시점 |
트랜잭션 종료 여부 | 트랜잭션 유지됨 | 트랜잭션 종료됨 |
롤백 가능 여부 | 가능 | 불가능(커밋되면 롤백 불가) |
내부적으로 flush() 호출 여부 | 명시적으로 호출 필요 | 내부적으로 자동 호출됨 |
주요 목적 | 변경 사항을 즉시 반영(트랜잭션 유지) | 변경 사항을 확정하고 트랜잭션을 종료 |
'Java > JPA' 카테고리의 다른 글
[JPA] 영속성 컨텍스트 (0) | 2025.02.21 |
---|---|
[JPA] Entity Manager (0) | 2025.02.12 |
[JPA] JPA 기초 및 개념 (0) | 2025.02.11 |