kongkong.note
[도메인 주도 개발 시작하기] 8. 애그리거트 트랜잭션 관리 본문
8.2 선점 잠금(Pessimistic Lock)
먼저 애그리거트를 구한 스레드가 애그리거트 사용이 끝날 때까지 다른 스레드가 해당 애그리거트를 수정하지 못하게 막는 방식
보통 DBMS의 행단위 잠금을 활용 - 특정 레코드에 한 커넥션만 접근할 수 있도록
스프링 데이터 JPA : @Lock(), @QueryHint() 활용
8.3 비선점 잠금(Optimistic Lock)
변경한 데이터를 실제 DBMS에 반영하는 시점에 변경 가능 여부를 확인하는 방식
스프링 데이터 JPA : @Version() 활용
8.4 오프라인 선점 잠금
여러 트랜잭션에 걸쳐 동시 변경을 방지하는 방식(누군가 수정 중일 때 다른 사람은 수정을 못하게 막는 것)
선점 vs 비선점 : 기본은 비선점 잠금
- 비선점 잠금 : DB Lock 안잡음, ex) 조회수, 좋아요 ..
- 선점 잠금 : DB Lock 잡음, ex) 쿠폰 실시간 - 정합성 절대적 필요할 때
실무에서는 DB Lock 피하는 구조를 선호
- unique 제약
- Redis
- 메세지 큐(Kafka..)
배송 상태로의 변경 트랜잭션이 끝나기 전, 사용자가 배송지 변경하는 예시 기반 실무 로직
- 상태 제한 (배송지 변경 가능한 상태 구간을 제한한다.)
- 상태 변경 API는 원자성으로 update (상태, 주소 등 한번에 update)
- 변경 이력 저장 (분쟁 증거 목적)
'DDD' 카테고리의 다른 글
| [도메인 주도 개발 시작하기] 10. 이벤트 (0) | 2026.01.18 |
|---|---|
| [도메인 주도 개발 시작하기] 9. 바운디드 컨텍스트 (0) | 2026.01.18 |
| [도메인 주도 개발 시작하기] 7. 도메인 서비스 (0) | 2026.01.04 |
| [도메인 주도 개발 시작하기] 6. 응용 서비스와 표현 영역 (0) | 2025.12.25 |
| [도메인 주도 개발 시작하기] 5. 스프링 데이터 JPA를 이용한 조회 기능 (0) | 2025.12.25 |