for update
와 같은 쿼리를 사용해서 특정 레코드에 한 사용자만 접근할 수 있는 잠금 장치를 제공한다.public abstract <T> T find(
Class<T> aClass,
Object o,
javax.persistence.LockModeType lockModeType
)
// Maven: org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final (hibernate-jpa-2.1-api-1.0.0.Final.jar)
LockModeType.PESSIMISTIC_WRITE
값으로 전달하면 해당 엔티티와 매핑된 테이블을 이용해서 선점 잠금 방식을 적용할 수 있다.PESSIMISTIC_WRITE
잠금 모드로 사용하면 for update
쿼리를 사용해시 선점 잠금을 구현한다.1. 스레드1: A 애그리거트에 대한 선점 잠금 구함
2. 스레드2: B 애그리거트에 대한 선점 잠금 구함
3. 스레드1: B 애그리거트에 대한 선점 잠금 시도
4. 스레드2: A 애그리거트에 대한 선점 잠금 시도
최대 대기 시간
을 지정해야 한 다. JPA에서 선점 잠금을 시도할 때 최대 대기 시간을 지정하려면 다음과 같이 힌트를 사용하면 된다public abstract <T> T find(
Class<T> aClass,
Object o,
javax.persistence.LockModeType lockModeType,
java.util.Map<String, Object> map
)
// Maven: org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final (hibernate-jpa-2.1-api-1.0.0.Final.jar)
javax.persistence.lock.timeout
힌트는 잠금을 구하는 대기 시간을 밀리초 단위로 지정한다. 지정한 시간 이내에 잠금을 구하지 못하면 익셉션을 발생시킨다.Map<String, Object> hints = new HashMap();
hints.put("javax.persistence.lock.timeout", 2000);
Order order = entityManager.find(
Order.class, orderNo,
LockModeType.PESSIMISTIC_WRITE, hints);