08장. 애그리거트 트랜잭션 관리

ajufresh·2020년 8월 26일
0

DDD START!

목록 보기
8/9
post-thumbnail

블로그에 게시하는 위 글은 전체적인 내용 정리가 아닌
책을 읽으면서 새로 알게된 내용이나 제가 중요하다고 생각하는 내용을 정리한 글입니디.

이렇게 바꾸면 각각 트랜잭션을 커밋할 때 수정한 내용을 DBMS에 반영하고,

배송 상태도 바뀌고 배송지 정보도 바뀌게 된다. ⇒ 애그리거트의 일관성이 깨진다. ⇒ 잠금 필요

대표적인 트랜잭션 처리 방식은 선전 잠금, 비선전 잠금이 있다.

선점 잠금

애그리거트를 구한 스레드가 애그리거트 사용이 끝날 때 까지 다른 스레드가 해당 애그리거트를 수정하는 것을 막는 방식이다.

선전 잠금과 교착 상태

  1. 스레드1: A 애그리거트에 대한 선점 잠금 구함
  2. 스레드2: B 애그리거트에 대한 선점 잠금 구함
  3. 스레드1: B 애그리거트에 대한 선점 잠금 시도
  4. 스레드2: A 애그리거트에 대한 선점 잠금 시도

이렇게 되면 스레드1은 영원히 B 애그리거트에 대한 선점 잠금을 구할 수 없고,

스레드2는 영원히 A 애그리거트에 대한 선점 잠금을 구할 수 없다. → 교착상태

방지책으로 최대 대기 시간을 설정한다.

비선전 잠금

변경한 데이터를 실제 DBMS에 반영하는 시점에 변경 가능 여부를 확인하는 방식이다.

애그리거트에 버전으로 사용할 숫자 타입의 프로퍼티를 추가해야한다.

UPODATE aggtable SET version = version + 1, colx = ?, coly = ?
WHERE aggid = ? AND version = 현재 버전

버전 값이 같을 때만 업데이트를한다.

강제 버전 증가

애그리거트에서 루트가 아닌 다른 엔티티의 값이 변경되는데, 버전을 올려야할 때가 있다.

JPA에서는 강제로 버전 값을 증가시키는 잠금 모드를 지원한다.

오프라인 선점 점금

여러 트랜잭션에 걸쳐 동시 변경을 막는다.

첫 번째 트랜잭션을 시작할 때 오프라인 잠금을 선점하고, 마지막 트랜잭션에서 잠금을 해제한다.

잠금을 해제하기 전까지 다른 사용자는 잠금을 구현할 수 없게 막는 방식이다.

단, 유효 시간을 둬야하고, 세션 같이 액션이 지속되면 유효 시간을 증가하는 방법을 써야한다.

profile
공블로그

0개의 댓글