2014-02-06 3 views
0

두 개의 최대 절전 엔터티가있다 : Order와 Items (save-update 캐스케이드가있는 일대 다, 특별한 것은 없다).최대 절전 모드 일대 다 SQL 실행 순서

두 명의 사용자가 동시에 두 개의 스레드에서 Session.saveOrUpdate (order) 작업을 트리거하는 새 항목을 추가하여 동일한 Order의 업데이트를 시작합니다.

Order와 Item 모두 Optimistic Lock을 지원하기 위해 @Version 열을 가지고 있으므로이 동시 편집은 OptimisticLockException으로 실패합니다.

그런 다음 데이터베이스 일관성을 높이고 해당 항목 중 하나에서 항목에 고유 제한 조건을 추가하려고합니다.

위의 경우를 반복하면 OptimisticLockException 대신 제약 조건 위반이 발생합니다! 최대 절전이하는 것처럼

이 보이는 (! 제약 voilation) ITEM 테이블에

  • INSERT 새 항목을
  • 체크 낙관적 잠금
  • UPDATE 주문 테이블

그것을 할 수 있습니다 Hibernate가 자식 아이템을 삽입하기 전에 낙관적 인 잠금을 체크 할 것인가?

답변

0

INSERT/UPDATE 주문을 변경할 수 없습니다. Hibernate는 INSERT가 항상 어떤 UPDATE보다 앞선 액션 큐를 가진다.

세부 사항은 org.hibernate.engine.spi.ActionQueue.executeActions 메소드에 있습니다. 위의 문제를 해결할 수있는 유일한 방법은 계단식 저장을 제거하는 것입니다. 부모 엔티티를 업데이트 한 다음 하위 항목을 추가하십시오.

0

버전 관리를 사용하여 동시 업데이트의 경우 Optimistic Lock Exception (JPA) 또는 StaleObjectStateException을 catch하고 Use case를 기반으로 동일하게 처리 할 수 ​​있습니다. 최신 엔티티를 다시로드하여 저장하거나 사용자 작업을 위해 다시 리디렉션 할 수 있습니다.