8장 : 애그리거트 트랜잭션 관리

애그리거트와 트랜잭션

한 주문 애그리거트에 대해 운영자는 배송 상태로 변경할 때 사용자는 배송지 주소를 변경하는 경우를 생각해보자. 일관성이 깨지는 문제가 발생하지 않도록 가음 두 가지 중 하나를 해야 한다.

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

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

이 두가지는 애그리거트 자체의 트랜잭션과 관련이 있는데 대표적으로 선점 잠금과 비선점 잠금의 두 가지 방식이 있다.

선점 잠금

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

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

선점 잠금과 교착 상태

  • 스레드 1 - A 애그리거트에 대한 선점 잠금 구함

  • 스레드 2 - B 애그리거트에 대한 선점 잠금 구함

  • 스레드 1 - B 애그리거트에 대한 선점 잠금 시도

  • 스레드 2 - A 애그리거트에 대한 선점 잠금 시

비선점 잠금

비선점 잠금은 동시에 접근하는 것을 막는 대신 변경한 데이터를 실제 DBMS에 반영하는 시점에 변경 가능 여부를 확인하는 방식이다.

강제 버전 증가

오프라인 선점 잠금

단일 트랜잭션에서 동시 변경을 막는 선점 방식과 달리 오프라인 선점 잠금은 여러 트랜잭셔에 걸쳐 동시 변경을 막는다. 첫 번째 트랜잭션을 시작할 때 오프라인 잠금을 선점하고, 마지막 트랜잭션에서 잠금을 해체한다.

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

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

DB를 이용한 LockManager 구현

Last updated