2011-01-06 2 views
1

분리 된 객체에 대해 기본 낙관적 잠금을 최대 절전 모드로 전환합니까?

void deleteObj(id){ 
    MyObj obj = getObjById(id); 
    if (obj == null) { 
     throw new CustomException("doesn't exists"); 
    } 
    em.remove(obj);//em is a javax.persistence.EntityManager 
} 

명시 적으로 optimistic locking 버전 필드를 구성하지 않았습니다. 그러나 두 개의 요청이 병렬로 실행중인 경우 동일한 개체를 삭제하려고하면 때때로 HibernateOptimisticLockingFailureException이 발생합니다. 및 다른 시간 "CustomException".

명시 적으로 낙관적 잠금을 설정하지 않고 HibernateOptimisticLockingFailureException을 얻는 것이 정상입니까? 분리 된 객체에 대해 기본 낙관적 잠금을 최대 절전 모드로 전환합니까?

이 HibernateOptimisticLockingFailureException을 처리하기 위해 무엇을하고 있습니까? 다시 시도하거나 "서버 사용 중"과 같은 기본 메시지를 사용하여 사용자에게 알리십시오.

답변

4

우선, HibernateOptimisticLockingFailureException은 Spring의 지속성 예외 변환 메커니즘의 결과입니다. 버전 번호 또는 타임 스탬프 검사 (버전 긴 트랜잭션을 사용할 때) 세션이 오래된 데이터를 포함 것을 나타내는, 실패했을 때

슬로우 : 그것은 누구의 javadoc는 말한다, StaleStateException에 대한 응답으로 발생합니다. 존재하지 않는 행을 삭제하거나 업데이트하려고 시도 할 때도 발생합니다.

데이터 수정 명령문이 영향을받는 행의 예상치 못한 수를 반환 할 때 낙관적 잠금 예외가 발생합니다. 행의 부재로 인한 것뿐만 아니라 버전 값의 불일치로 인해 발생할 수 있습니다.

엔티티가 실제로 잘 제거한 후 em.flush()하여 컨텍스트를 플러시하려고 그것에 의해 던져진 예외를 잡을 수 제거되었는지 확인하려면 (그것이 원인으로 StaleStateException을 가진 PersistenceException의 서브 클래스해야 있습니다).

+0

tks! "존재하지 않는 행을 삭제하거나 업데이트하려고하면 발생합니다."이것이 내 경우 인 것처럼 보입니다. 예외를 처리하는 좋은 방법은 무엇입니까? 다시 시도 하시겠습니까? 또는 "서버 사용 중"과 같은 기본 메시지를 보내야합니까? –

+0

알다시피, 행을 다시 나타나게 만들 가능성은 희박합니다. 바쁜 서버로 인해 데이터베이스에서 행이 사라지지 않아야합니다. – meriton

+0

처리 방법은 예외를 무시하십시오. 삭제를 실행하면 행이 더 이상 존재하지 않게됩니다. 이미 삭제 한 경우 행 아웃이 이미 완료된 경우입니다. – meriton

관련 문제