2012-11-15 3 views
0

우리 웹 사이트에는 동일한 테이블에 대해 작동하는 두 개의 연산이 있습니다. 하나는 여러 행을 읽고 다른 하나는 행을 삭제합니다.DELETE 중에 StaleObjectStateException을 발생시키는 동시 읽기입니까?

우리는 Spring 3.1과 Hibernate 3.6을 사용하고있다.

정확한 작업은

EntityManager.createQuery().getResultList(); 

EntityManager.remove(); 

우리는하지 getResultList() 스레드에서, 제거() 스레드에서 StaleObjectStateException을 받고 있습니다. 문제는 왜 읽음이 StaleObjectException의 원인인가?

+0

이렇게해서는 안됩니다. 엔티티를 검색 한 후에 엔티티를 수정하는 방법이 없다는 것이 확실합니까? 어쩌면 일종의 부작용이있을 수 있습니까? 읽기 작업을 별도로 실행 한 다음 @Version 주석이 달린 열이 변경되는지 확인해야합니다. – Pace

답변

0

, 두 개의 별도의 HTTP 요청을 일으키는 원인이 된 HTML/자바 스크립트 문제는 문제의 링크가 있었다 모든 시간을 확인할 수 있었다 클릭 함. (두 요청은 모두 수정으로 인해 충돌의 원인이되었습니다.)

사람들이 Spring과 Hibernate DO가 작동한다는 것을 알 수 있도록이 응답을 여기에 표시합니다.

0

Pace가 말했듯이, Instace가 여전히 첨부되어있는 동안 쿼리를 검색 한 일부 인스턴스를 수정하는 중일 수 있습니다. 즉, 첨부 된 인스턴스 내에서 persistenceContext (EntityManager의 "인스턴스") 이전에 트랜잭션을 커밋해야합니다.

다른 가능한 점은 버전 속성의 값을 덮어 쓰는 것입니다. 따라서 entityManager는 인스턴스/엔티티를 수정 된 것으로 표시 할뿐만 아니라 더 낮은/예상치 못한 버전 값으로 업데이트 쿼리를 실행합니다.

감사

이 문제의 근본 원인은 최대 절전 모드 또는 봄에 전혀 관계가없는 것으로 밝혀졌다
관련 문제