본문 바로가기

[DDD START] 8장 애그리거트 트랜잭션 관리

운영자와 고객이 동시에 한 주문 애그리거트를 수정할 때, 

메모리 캐시를 사용하지 않을 경우 운영자 스레드와 고객 스레드는 같은 주문 애그리거트를 나타내는 다른 객체를 구하게 된다. 

각자 주소를 변경하게 되면 애그리거트의 일관성이 깨진다. 

- 운영자가 배송지 정보를 조회하고 상태를 변경하는 동안 고객이 애그리거트를 수정하지 못하게 막는다.

- 운영자가 배송지 정보를 조회한 이후에 고객이 정보를 변경하면 운영자가 애그리거트를 다시 조회한 후 수정하도록 한다. 

 

선점잠금(Pessimistic Lock)

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

- 선점 잠금 기능을 사용할 때는 잠금 순서에 따른 교착 상태(deadlack)가 발생하지 않도록 주의해야 한다. 

   -  잠금을 구할 때 최대 대기 시간을 지정해야 한다. 

 

비선점잠금(Optimistic Lock)

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

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

  -> 애그리거트와 매핑되는 테이블의 버전값이 현재 애그리거트의 버전과 동일한 경우에만 데이터 수정, 버전값 1 증가

- 강제 버전증가 

  애그리거트의 루트 엔티티 이외의 데이터(value)가 변경이 되어도 버전을 증가시켜 줘야 한다

 애그리거트 내의 구성요소가 변경된 것이므로 강제로 버전을 증가시켜야 함.

 

오프라인 선점 잠금

한 트랜잭션 범위에서만 적용되는 선점 잠금 방식이나, 나중에 버전 충돌을 확인하는 비선점 잠금 방식

단일 트랜잭션에서 동시 변경을 막는 선점 잠금 방식과 달리 오프라인 선점 잠금은 여러 트랜잭션에 걸쳐 동시 변경을 막는다. 

- 잠금 선점 시도

- 잠금 확인

- 잠금 해제

- 락 유효 시간 연장