블로그에 게시하는 위 글은 전체적인 내용 정리가 아닌
책을 읽으면서 새로 알게된 내용이나 제가 중요하다고 생각하는 내용을 정리한 글입니디.
이렇게 바꾸면 각각 트랜잭션을 커밋할 때 수정한 내용을 DBMS에 반영하고,
배송 상태도 바뀌고 배송지 정보도 바뀌게 된다. ⇒ 애그리거트의 일관성이 깨진다. ⇒ 잠금 필요
대표적인 트랜잭션 처리 방식은 선전 잠금, 비선전 잠금이 있다.
애그리거트를 구한 스레드가 애그리거트 사용이 끝날 때 까지 다른 스레드가 해당 애그리거트를 수정하는 것을 막는 방식이다.
이렇게 되면 스레드1은 영원히 B 애그리거트에 대한 선점 잠금을 구할 수 없고,
스레드2는 영원히 A 애그리거트에 대한 선점 잠금을 구할 수 없다. → 교착상태
방지책으로 최대 대기 시간을 설정한다.
변경한 데이터를 실제 DBMS에 반영하는 시점에 변경 가능 여부를 확인하는 방식이다.
애그리거트에 버전으로 사용할 숫자 타입의 프로퍼티를 추가해야한다.
UPODATE aggtable SET version = version + 1, colx = ?, coly = ?
WHERE aggid = ? AND version = 현재 버전
버전 값이 같을 때만 업데이트를한다.
애그리거트에서 루트가 아닌 다른 엔티티의 값이 변경되는데, 버전을 올려야할 때가 있다.
JPA에서는 강제로 버전 값을 증가시키는 잠금 모드를 지원한다.
여러 트랜잭션에 걸쳐 동시 변경을 막는다.
첫 번째 트랜잭션을 시작할 때 오프라인 잠금을 선점하고, 마지막 트랜잭션에서 잠금을 해제한다.
잠금을 해제하기 전까지 다른 사용자는 잠금을 구현할 수 없게 막는 방식이다.
단, 유효 시간을 둬야하고, 세션 같이 액션이 지속되면 유효 시간을 증가하는 방법을 써야한다.