홈 › 실무 확장 › 15 / 22

@Transactional 심화

전파·격리·readOnly·롤백 규칙·self-invocation·REQUIRES_NEW·락
섹션 7진행 0 / 22

7. 정리

  • 트랜잭션 경계는 프록시가 만들며, 프록시를 거치지 않은 호출(self-invocation, private·final 메서드)에는 적용되지 않습니다.
  • 실무 전파 속성은 REQUIRED 와 REQUIRES_NEW 둘이면 충분하고, 실패해도 남겨야 하는 로그만 REQUIRES_NEW 로 분리합니다.
  • 기본 롤백 규칙은 unchecked 예외만 대상이라, checked 예외까지 롤백하려면 rollbackFor 를 명시해야 합니다.
  • 내부 트랜잭션의 실패를 catch 로 삼키면 rollback-only 상태가 남아 커밋 시점에 UnexpectedRollbackException 이 발생합니다.
  • Oracle 기본 격리 수준은 READ COMMITTED 이고, readOnly=true 는 DB 를 강제하지 않는 힌트입니다.
  • 동시 수정은 비관적 락(FOR UPDATE)과 낙관적 락(버전 컬럼) 중 충돌 빈도에 맞게 고르고, 락 순서를 통일해 데드락을 피합니다.
  • MyBatis 는 SqlSessionTemplate 을 통해 Spring 트랜잭션에 자연스럽게 참여합니다.