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 트랜잭션에 자연스럽게 참여합니다.