8.1 애그리거트와 트랜잭션

예시)

운영자 → 주문 애그리거트 구함 → 배송 상태로 변경 → 트랜잭션 커밋

고객 → 주문 애그리거트 구함 → 배송지 변경 → 트랜잭션 커밋

예시의 문제점)

운영자는 기존 배송지 정보를 이용해서 배송 상태를 변경했는데 그 사이 고객은 배송지 정보를 변경했다는 문제점이 있다. 즉, 애그리거트의 일관성이 깨지는 것이다.

예시의 해결책)

8.2 선점 잠금

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

예시)

운영자 → 주문 애그리거트 구함(접근 잠금) → 배송 상태로 변경 → 트랜잭션 커밋(잠금 해제)

고객 → 주문 애그리거트 구함 시도 (잠금으로 대기) → (잠금된 동안 블로킹) → 주문 애그리거트 구함 (접근 잠금) → 배송지 변경(시도 실패) → 트랜잭션 실패(잠금 해제)

선점 잠금은 보통 DBMS가 제공하는 행 단위 잠금을 사용해서 구현한다. 오라클을 비롯한 다수의 DBMS가 for update와 같은 쿼리를 사용해서 특정 레코드에 한 커넥션만 접근할 수 있는 잠금장치를 제공한다.