2011-03-15 2 views
2

"낙관적 인 잠금"메커니즘을 사용하는 것이 새로운 것입니다 - 나는 절전 모드 (Jboss에서)와 컨테이너 관리 트랜잭션 (CMT)을 사용하고 있습니다. 내 엔티티 읽기엔티티 업데이트 사이에 다른 엔티티 (예 : 행)가 DB에서 업데이트 될 때 시나리오를 처리하려고합니다. 나는 예외를 throw 할 그런 경우 ..낙관적 인 잠금 (최대 절전 모드)에 대한 기본적인 질문

내가 @Version 내 법인을 주석 한 - 이제

@Version 
private Long version; 

처럼,이 버전 관리를위한 충분한 경우 나는 혼란 스러워요 아니면 명시 적으로 호출 할 필요가 사전에

{ 
    . 
    . 
    final QueryDTO queryDTO = entityManager.find(QueryDTO.class, id); 
    entityManager.lock(queryDTO, LockModeType.READ); 
    queryDTO.setStatus(updatedStatus); 
    entityManager.persist(queryDTO); 
    } 

덕분에 같은 EntityManager.lock() API,

답변

6

있습니다 (P 명시 적으로 잠금을 필요로하지 않습니다 essimistic locking) @Version을 통한 낙관적 잠금을 사용할 때.

UPDATE QueryDTO SET status=<updated status>, ...other values..., version=100 WHERE id=<id> AND version=99

업데이트가 실패하는 경우는 (사람/뭔가 다른 데이터와 버전을 변경), 당신이 OptimisticLockException를 얻을 수 있습니다 (: 엔티티가 데이터베이스에 업데이트 될 때, 다음 쿼리와 같은 일이 일어날 것이다 EntityManager를 사용하고 있기 때문에, JPA에 관한 것이고, StaleStateException과 같은 "원시"Hibernate로 가정합니다.

관련 문제