트랜잭션 전파 옵션
- REQUIRED: 현재 트랜잭션이 있으면 그 트랜잭션에서 실행하고, 없으면 새 트랜잭션을 시작합니다.
- REQUIRED_NEW: 항상 새 트랜잭션을 시작하며, 기존 트랜잭션이 있으면 잠시 중단합니다.
- SUPPORTS: 트랜잭션이 있으면 그 트랜잭션 내에서 실행하고, 없으면 트랜잭션 없이 실행합니다.
- NOT_SUPPORTED: 트랜잭션 없이 실행하며, 기존 트랜잭션이 있으면 잠시 중단합니다.
- MANDATORY: 반드시 트랜잭션 내에서 실행하며, 진행 중인 트랜잭션이 없으면 예외를 발생시킵니다.
- NEVER: 트랜잭션 없이 실행하며, 기존 트랜잭션이 있으면 예외를 발생시킵니다.
- NESTED: 현재 트랜잭션이 있으면 중첩 트랜잭션 내에서 실행하며, 없으면 새 트랜잭션을 시작합니다.
Controller : 가공처리
DTO : Controller - Service 사이 오가는 것
Entity : Service - Repository(DAO) 오가는 것
NESTED 옵션 예시
- 중첩 트랜잭션 활용: 대량 데이터 배치 처리 시, 예를 들어 100만 개의 업무를 10만 개씩 처리하며 중간에 문제가 발생하면 해당 부분만 롤백할 수 있습니다.
- 주의사항: 세이브포인트를 지원하지 않는 환경에서는 사용 불가능합니다.
격리 수준 (Isolation Level)
- DEFAULT: DB의 기본 격리 수준을 사용합니다. 대부분의 DBMS에서는 READ_COMMITTED가 기본 설정입니다.
- READ_UNCOMMITTED: 커밋되지 않은 데이터를 읽을 수 있어, 오염된 값 읽기, 재현 불가능한 값 읽기, 허상 읽기 등의 문제가 발생할 수 있습니다.
- READ_COMMITTED: 커밋된 데이터만 읽을 수 있어 오염된 값 읽기 문제는 해결되지만, 재현 불가능한 값 읽기 및 허상 읽기 문제는 여전히 존재합니다.
- REPEATABLE_READ: 트랜잭션 동안 동일한 값을 읽도록 보장하며, 오염된 값 읽기 및 재현 불가능한 값 읽기 문제를 해결하지만 허상 읽기는 여전히 발생할 수 있습니다.
- SERIALIZABLE: 트랜잭션 동안 동일한 로우를 읽도록 보장하며, 동시성 문제는 모두 해결되지만 성능이 저하될 수 있습니다.
동시성 문제 설명
- 오염된 값: 커밋되지 않은 데이터를 다른 트랜잭션이 읽을 수 있어, 롤백 시 해당 데이터가 유효하지 않게 되는 상황입니다.
- 재현 불가능한 값 읽기: 하나의 트랜잭션이 데이터를 수정한 후, 다른 트랜잭션이 그 데이터를 읽어 재현 불가능한 값이 되는 상황입니다.
- 허상 읽기: 트랜잭션 동안 테이블의 로우가 추가되어 처음 읽은 데이터와 달라지는 상황입니다.
'TIL' 카테고리의 다른 글
[24.08.26] Spring 간략한 구조 (0) | 2024.08.26 |
---|---|
[24.08.21] Persistent Context(JPA) (0) | 2024.08.25 |
[24.08.15] Servlet에서 궁금한점 몇가지 정리 (0) | 2024.08.15 |
[24.08.15] java, spring Annotation 정리 (0) | 2024.08.15 |
[24.08.12] AOP, Filter, interceptor 차이가 뭐지? (0) | 2024.08.13 |