2012-05-01 4 views
3

봄 mvc 3.0 사용 및 최대 절전 모드입니다. 여기에 상황이 있는데, 사용자가 항목을 추가하고 제거 할 수있는 인벤토리가 있습니다. 예를 들어, 총 수량 = 50입니다. 이제 한 번에 두 명의 사용자가 A로 제거한 2 개의 항목과 B로 제거한 4 개의 항목과 같은 인벤토리를 업데이트하려고합니다. 따라서 총 수량 = 44입니다. 이제 두 사용자가 동시에 재고를 업데이트하려고 할 때 어떻게해야합니까? ?? 트랜잭션이 유지되지 않으면 50-2 = 48, 50-4 = 46과 같습니다.봄 mvc 및 hiberante 트랜잭션

답변

-1

버전 관리와 함께 낙관적 잠금을 사용할 수 있습니다. 영구적 인 클래스 매핑에 또는 속성을 추가하자마자 버전 관리를 통한 낙관적 잠금이 활성화됩니다. XML의 속성 매핑이 식별자 프로퍼티 매핑 후 즉시 배치해야합니다 :이

<class name="Item" table="ITEM"> 
    <id .../> 
    <version name="version" access="field" column="OBJ_VERSION"/> 
    ... 
</class> 

, 항목이 업데이트되면, SQL은 다음과 같습니다

update ITEM set INITIAL_PRICE='12.99', OBJ_VERSION=2 
where ITEM_ID=123 and OBJ_VERSION=1 

작업의 또 다른 동시 장치가 업데이트 한 경우 동일한 행을 커밋 한 경우 OBJ_VERSION 열에 더 이상 값 1이 포함되지 않고 행이 업데이트되지 않습니다. Hibernate는 JDBC 드라이버 (이 경우 갱신 된 행 수인 0)에서 리턴 된이 명령문의 행 수를 확인하고 StaleObjectStateException을 발생시킵니다. 당신은 버전이나 타임 스탬프 열이없는 경우

는, Hibernate는 여전히 있지만 같은 영속 컨텍스트에서 검색 및 수정 객체 (즉, 같은 세션), 자동 버전을 수행 할 수 있습니다. 이 대체 구현은 오브젝트가 검색된 시점 (또는 지속성 컨텍스트가 마지막으로 플러시 된 시간)에 현재 데이터베이스 상태를 지속적 특성의 수정되지 않은 값과 비교하여 검사합니다.

<class name="Item" table="ITEM" optimistic-lock="all"> 
<id .../> 
... 
</class> 

다음 SQL은 이제 항목 인스턴스의 수정을 플러시 실행 : 업데이트 항목이 ITEM_PRICE을 설정 = '12 .99 '당신은 클래스 매핑에 낙관적 잠금 속성을 설정하여이 기능을 가능하게 할 수있다 ITEM_ID은 = 123 및 ITEM_PRICE = '9.99' 및 ITEM_DESCRIPTION = "항목" 와 ... 및 SELLER_ID = 두 번째 트랜잭션을 다시 시작하거나 병합하는 당신까지 45 두 경우 모두

, 그건 언제 업데이트 당신은 StaleObjectStateException을 얻는다. 이 경우는 매우 드문 경우 여야합니다. 그렇지 않으면 트랜잭션 범위를 줄이기 위해 리팩터링을 통해 크기를 작고 빠르게 변경해야합니다.

자세한 내용은 CHRISTIAN BAUER 및 GAVIN KING의 "Java Persistent with Hibernate"설명서를 참조 할 수 있습니다. (권장)

편집 : 라이언이 맞습니다. 나는 내 대답을 바로 잡는다.

+1

또한 잘못된 것입니다. Hibernate는 기본적으로 낙관적 인 잠금으로 설정되어 있으므로 "정상적으로 작동하지 않습니다". –

+0

@ Ryan Stewart 낙관적 인 잠금이란 무엇입니까? u는 조금 설명 할 수 있습니까 ?? – curiouss

+0

나는 낙관적 인 자물쇠를 찾고 그것을 발견 : 낙관적 인 접근 방식은 항상 모든 것이 괜찮을 것이라고 가정하고 상충되는 데이터 수정은 거의 없다고 가정합니다. 낙관적 동시성 제어는 데이터가 기록되는 작업 단위의 끝에 만 오류를 발생시킵니다. 다중 사용자 응용 프로그램은 일반적으로 낙관적 동시성 제어 및 읽기 커밋 된 격리 수준의 데이터베이스 연결을 기본으로합니다. 추가 격리 보증은 적절한 경우에만 획득됩니다. 예를 들어, 반복 가능한 읽기가 필요할 때. 이 방법은 최상의 성능과 확장 성을 보장합니다. – Jacky