데이터베이스의 상태를 변화시키는 하나 이상의 작업 단위로, 모든 작업이 성공하면 함께 커밋(Commit) 되고 하나라도 실패하면 전부 롤백(Rollback) 되는 것을 보장하는, “모두 성공 하거나(All or Nothing) 모두 실패해야 한다” 는 불가분성 원칙

4가지 핵심 속성 — ( ACID )

A - Atomicity (원자성)

→ 모두 성공하거나 모두 실패 (e.g 주문 + 결제 모두 성공해야 커밋)

C - Consistencty (일관성)

→ 데이터 제약 조건 유지 (e.g 결제 금액 < 0 이면 롤백)

I - Isolation (격리성)

→ 트랜잭션 간 간섭 방지 (e.g 동시에 수정 시 Lock 처리)

D - Durability (지속성)

→ 커밋된 데이터는 영구 보존 (e.g 시스템이 다운되어도 커밋된 데이터 유지)

Spring 에서 트랜잭션

Spring 의 트랜잭션(@Transactional)은 프록시 객체를 통해 트랜잭션을 제어한다.

Client → Proxy(OrderService) → Target(OrderServiceImpl)
  1. Clinet 가 OrderService 메서드 호출
  2. 프록시가 트랜잭션을 시작
  3. 실제 비즈니스 로직 수행
  4. 정상 종료 시 commit() , 예외 발생 시 rollback()

👉🏻 즉, 프록시가 감싸고 있는 구조라서 내부 메서드에서 this.method() 로 호출하면 트랜잭션이 새로 적용되지 않는다. ( 자기 참조 : self-Innvocation )

트랜잭션 주의사항

  1. 프록시 내부 self-innvocation 금지 : 같은 클래스 내부 호출은 트랜잭션이 적용되지 않는다
  2. 읽기 전용 트랜잭션 : @Transactional(readOnly = true) 로 조회 성능 최적화 할것