출처: https://incheol-jung.gitbook.io/docs/study/ddd-start/8
한 애그리것을 두 사용자가 동시에 변경할 때 트랜잭션이 필요하다.
메모리 캐시를 사용하지 않을 경우 운영자 스레드와 고객 스레드는 같은 주문 애그리것을 나타내는 다른 객체를 구하게 된다. ( 트랜잭션마다 리포지터리는 새로운 액릐것 객체를 생성한다. )
운영자스레드와 고객스레드는 개념적으로 동일한 애그리것이지만 물리적으로는 서로 다른 애그리것 객체를 사용한다.
떄문에 운영자 스레드가 주문 애그리것 객체를 배송 상태로 변경하더라도 고객 스레드가 사용하는 주문애그리것 객체에는 영향을 주지 않는다.
고객스레드 입장에서 주문 애그리것 객체는 아직 배송 상태 전이므로 배송 정보를 변경할 수 있다.
이 상황에서 두 스레드는 각각 트랜잭션을 커밋할 때 수정한 내용을 DBMS에 반영한다.
즉 배송상태로 바뀌고 배송지 정보도 바뀌게 된다.
이 순서의 문제점은 운영자는 기존 배송지 정보를 이용해서 배송상태로 변경했는데 그사이 고객은 배송지 정보를 변경했다는 점이다. 즉 애그리것의 일관성이 깨지는 것이다.
이 문제를 방지하려면 두가지 중 하나를 해야 한다.
대표적인 트랜잭션 처리 기법에는 선점 잠금과 비선점 잠금의 두가지 방식이 있다.