[본캠프]트랜잭션, 영속성 컨텍스트

윤영범·2026년 4월 16일

1. 트랜잭션 (Transaction)

  • 정의

    DB 작업을 하나의 단위로 묶어서 처리하는 것
    모든 작업이 성공하면 commit, 하나라도 실패하면 rollback

  • 핵심 목적

    데이터 일관성 유지
    중간 실패 시 전체 작업 취소

  • 동작 흐름

    트랜잭션 시작

    비즈니스 로직 수행

    성공 → commit (DB 반영)
    실패 → rollback (전체 취소)

  • 핵심 포인트

    commit 시점에 실제 SQL 실행
    예외 발생 시 자동 rollback
    트랜잭션 안에서만 JPA 기능 동작


2. 영속성 컨텍스트 (Persistence Context)

  • 정의

    엔티티를 관리하는 메모리 공간 (1차 캐시)

  • 특징

    1.1차 캐시
    같은 엔티티 재조회 시 DB 접근 최소화
    2.변경 감지 (Dirty Checking)
    user.setName("홍길동");
    → commit 시 자동 UPDATE 실행
    3.쓰기 지연
    SQL을 모아두었다가 commit 시 실행


3. 엔티티 상태

상태설명JPA 관리DB 반영예시
비영속 (Transient)아직 DB와 관계 없는 상태new User()
영속 (Managed)JPA가 관리 중인 상태✅ (commit 시)findById()
준영속 (Detached)한 번 관리됐지만 지금은 아님트랜잭션 종료 후
삭제 (Removed)삭제 예정 상태✅ (DELETE)delete()
  • 핵심

영속 상태일 때만 변경 감지 → 자동 update

4. save() 메서드의 진짜 의미

❌ 내가생각했던 오해
save = 저장 (insert만 한다)
✔️ 실제

👉 영속 상태로 만드는 메서드

상황객체 상태save() 동작SQL 실행특징
new 객체비영속 (Transient)영속 상태로 전환INSERT새로운 데이터 생성
조회된 객체영속 (Managed)의미 없음자동 UPDATE (Dirty Checking)save() 필요 없음
ID만 있는 객체준영속 (Detached)merge 수행UPDATE (또는 SELECT 후 UPDATE)값 덮어쓰기 위험

실무 기준:
save는 생성할 때만 사용

5. 트랜잭션 전파 (Propagation)

  • 정의

    트랜잭션 내부에서 다른 트랜잭션 호출 시 동작 방식

자주사용하는 주요 옵션
REQUIRED (기본) - 기존 트랜잭션 참여
REQUIRES_NEW - 무조건 새 트랜잭션 생성

  • 사용 예

    로그 저장, 감사 기록
    → 실패해도 반드시 남겨야 하는 경우

6. 트랜잭션 격리 (Isolation)

  • 정의
    동시에 실행되는 트랜잭션 간 간섭 제어
격리 수준Dirty ReadNon-repeatable ReadPhantom Read특징
READ UNCOMMITTED❌ 발생❌ 발생❌ 발생커밋 전 데이터도 읽음 (위험)
READ COMMITTED✅ 방지❌ 발생❌ 발생커밋된 데이터만 읽음 (기본)
REPEATABLE READ✅ 방지✅ 방지❌ 발생같은 데이터 유지
SERIALIZABLE✅ 방지✅ 방지✅ 방지완전 격리 (성능 낮음)
  • 트랜잭션 문제 유형
문제설명
Dirty Read커밋 안 된 데이터 읽음
Non-repeatable Read같은 조회인데 값이 바뀜
Phantom Read조회 결과 개수가 바뀜

0개의 댓글