public Order findByIdOptimisticLockMode(OrderNo id) {
Map<String, Object> hints = new HashMap<>();
hints.put("javax.persistence.lock.timeout", 2000);
return entityManager.find(Order.class, id, LockModeType.OPTIMISTIC_FORCE_INCREMENT, hints);
}
단일 트랜잭션에서 동시에 변경을 막는 선점 잠금 방식과 달리 오프라인 선점 잠금은 여러 트랜잭션에 걸쳐 동시 변경을 막는다.
첫번째 트랜잭션을 시작할 때 오프라인 잠금을 선점하고, 마지막 트랜잭션에서 잠금을 해제한다.
잠금을 해제하기 전까지 다른 사용자는 잠금을 구할 수 없다.
예를 들어 수정 기능을 생각해보자, 보통 수정 기능은 두 개의 트랜잭션으로 구성된다.
첫번째 트랜잭션은 폼을 보여주고, 두번째 트랜잭션은 데이터를 수정한다.
오프라인 선점 잠금을 사용하면 폼 요청과정에서 잠금을 선점하고 수정과정에서 잠금을 해제한다.
이미 잠금을 선점한 상태에서 다른 사용자가 폼을 요청하면 과정 2처럼 잠금을 구할 수 없어 에러 화면을 보게 된다.