여러 스레드가 동시에 하나의 애그리거트를 수정하면 애그리거트의 일관성이 깨지게 된다.

선점 잠금 - 비관적 락

먼저 애그리거트를 조회한 스레드가 애그리거트의 사용이 끝날 때까지 다른 스레드는 해당 애그리거트를 수정할 수 없는 방식

JPA를 사용할 때 비관적 락을 사용하는 방법 - @Lock(LockModeType.PESSIMISTIC_WRITE) 을 사용한다.

@Lock(LockModeType.PESSIMISTIC_WRITE)
Optional<Member> findById(Stirng id);

비관적 락은 교착 상태에 빠질 수 있다.

이를 해결하기 위해서 다음과 같이 대기 시간을 지정해야한다.

@Lock(LockModeType.PESSIMISTIC_WRITE)
@QueryHints({
	@QueryHint(name ="javax.persistence.lock.timeout", value ="2000")
})
Optional<Member> findById(Stirng id);

비선점 잠금 - 낙관적 락

엔티티에 @Version을 사용한 필드를 지정한다.

엔티티를 조회하고 수정하는 과정에서 버전이 맞지 않게 되면 예외가 발생한다.

이 때문에 트랜잭션이 롤백된다.