2

첫 번째와 두 번째 쿼리 사이의 다른 세션에서 동시 업데이트를 통해 쿼리의 결과 데이터가 변경된 경우 한 tx에서 같은 쿼리를 두 번 수행하면 Hibernate를 사용하여 StaleObjectStateException을 얻을 수 있습니까?최대 절전 모드 - 쿼리에서 StaleObjectStateException이 발생합니까?

이 시나리오에서는 모든 엔터티에 낙관적 동시성 제어를 사용하고 있습니다.

그래서 이렇게 보입니다.

스레드 1 : 트랜잭션이 시작
스레드 1 : 쿼리 실행 및 키 = 4711
스레드-2 즉, 위해 검색됩니다 : 키 4711과 같은 순서로는, 검색 변경 및 두 번째 스레드에 최선을 다하고됩니다
스레드 -1 : 쿼리가 다시 실행되고 key = 4711로 주문을 반환합니다.

두 번째 쿼리에서 스레드 -1에 StaleObjectStateException이 표시됩니까?

도움 주셔서 감사합니다.

토마스

답변

1

면책 조항 : 나는 그것을 시도하지 않았으며, 이것은 내가 최대 절전 모드를 알고있는 것으로 기대되는 것입니다.

StaleObjectStateException은 두 번째 쿼리를 실행할 때 또는 thread-1의 트랜잭션이 커밋 될 때 발생합니다.

그러나, order이 두 번째 쿼리가 실행되기 전에 수정 된 경우 order 플러시 (가정 자동 플러시 모드 및 트랜잭션 읽기 - 쓰기) 얻을 두 번째 쿼리가 실행됩니다 직전이는 StaleObjectStateException를 트리거됩니다.

+0

답변 해 주셔서 감사합니다. 그동안 나는 당신이 묘사 한 것을 정확히 보여주는 시험을 썼습니다. thread-1이 어떻게해서 두 번째 쿼리를 실행하기 전에 순서를 변경하면 autoflush로 인해 StaleObjectException이 발생합니다. 이것은 실제로 최근 프로젝트에서 발생했으며 처음에는 다소 이상하게 보였습니다. 순서 변경은 부작용 때문이었습니다. – herrwieger

0

나는 그렇게 생각하지 않는다. Thread-1의 두 번째 쿼리는 데이터베이스에 도달하지 않습니다. 첫 번째 레벨 캐시 (세션)에서 부실 객체를 가져옵니다. 하지만 두 번째 쿼리 후에 순서를 변경하면 세션을 플러시 할 때 예외가 발생합니다.