애그리거트 트랜잭션 관리

2023. 8. 26. 14:38스터디/DDD 스터디

728x90

트랜젝션이 잘못되면 데이터의 일관성이 깨진다. 즉, 애그리거트의 일관성이 깨지기 떄문에 적절한 트랜잭션 처리 기법이 필요하다.

애그리거트에 대해 사용할 수 있는 대표적인 트랜잭션 처리 방식은 선점 잠금과 비선점 잠금이 있다.

 

# 선점 잠금

선점 잠금은 먼저 애그리거트를 구한 스레드가 애그리거트 사용이 끝날 때까지 다른 스레드가 해당 애그리거트를 수정하지 못하게 막는 방식이다.

 스레드 1이 선점 잠금 방식으로 애그리거트를 구하면, 스레드2 는 애그리거트에 대한 잠금이 해제할 때까지 블로킹(Blocking)된다.

선점 잠금은 보통 DMBS가 제공하는 행단위 잠금을 사용해서 구현한다.

Jpa EntityManager.find() 함수를 통해 선점 잠금 방식을 사용할 수 있다.  LockModeType을 PESSIMISTIC_WRITE를 사용하면 된다.

Data-jpa 에서는 @Lock Annocation을 지원한다.

선점 잠금 기능 사용시에는 교착 상태(Deadlock)가 발생하지 않도록 주의해야 한다.

데드락에 빠지지 않게 하려면 잠금을 구할 때 최대 대기 시간을 지정해야 한다.

data-jpa애서는 @QueryHInts 에너테이션을 사용해서 쿼리 힌트를 지정할 수 있다.

# 비선점 잠금

선점 잠금으로 모든 트랜젝션 충돌 문제를 해결할 수는 없다.

비선점 잠금은 동시에 접근하는 것을 막지 않고, 변경한 데이터를 실제 DMBS에 반영하는 시점에 변경 가능 여부를 확인하는 방식

에그리거트에 버전을 적용해서 수정할 때마다 버전이 올라가는 방식으로 진행.

애그리거트와 매핑되는 테이블의 버전 값이 현재 에그리거트의 버전과 동일한 경우에만 데이터를 수정한다.

JPA는 버전을 이용한 비선점 잠금 기능을 지원

 

 

# 오프라인 선점 잠금

여러 트랜젝션에 걸쳐 동시 변경을 막는 방식.

첫 트랜젝션 시작 시 오프라인 잠금을 선점하고, 마지막 트랜젝션에서 잠금을 해제.

잠금을 해제하기 전까지 다른 사용자는 잠금을 구할 수 없다.

그런다, 잠금을 요청한 후에 수정 요청을 수행하지 않고 프로그램 종료시에는 다른 사용자가 영원히 잠금을 구할 수 없음.

위 사태를 방지하기 위해 오프라인 선점 방식은 잠금 유효 시간을 가져야.

### 오프라인 선점 잠금을 위한 LockManager 인터페이스와 관련 클래스

오프라인 선점 잠금은 크게 잠금 선점 시도, 잠금 확인, 잠금 해제, 잠금 유효시간 연장. 네 가지 기능이 필요

 

728x90

'스터디 > DDD 스터디' 카테고리의 다른 글

이벤트  (1) 2023.09.09
도메인 모델과 바운디드 컨텍스트  (0) 2023.09.02
도메인 서비스  (0) 2023.08.18
응용 서비스와 표현 영역  (0) 2023.08.12
스프링 데이터 JPA를 이용한 조회 기능  (0) 2023.08.05