봄 mvc 3.0 사용 및 최대 절전 모드입니다. 여기에 상황이 있는데, 사용자가 항목을 추가하고 제거 할 수있는 인벤토리가 있습니다. 예를 들어, 총 수량 = 50입니다. 이제 한 번에 두 명의 사용자가 A로 제거한 2 개의 항목과 B로 제거한 4 개의 항목과 같은 인벤토리를 업데이트하려고합니다. 따라서 총 수량 = 44입니다. 이제 두 사용자가 동시에 재고를 업데이트하려고 할 때 어떻게해야합니까? ?? 트랜잭션이 유지되지 않으면 50-2 = 48, 50-4 = 46과 같습니다.봄 mvc 및 hiberante 트랜잭션
답변
올바른 의미를 보장하려면 version property을 사용하십시오. 이것은 Hibernate 참조 가이드의 전체 섹션의 주제입니다. "Optimistic concurrency control"
버전 관리와 함께 낙관적 잠금을 사용할 수 있습니다. 영구적 인 클래스 매핑에 또는 속성을 추가하자마자 버전 관리를 통한 낙관적 잠금이 활성화됩니다. 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. 봄 3 트랜잭션 지원
- 2. 자동 커밋 및 봄 선언적 트랜잭션
- 3. 자바 봄 : @Transactional rollbackFor 및 트랜잭션 경계
- 4. 봄 @MVC 및 @RequestParam 검증
- 5. 봄 mvc 최대 절전 트랜잭션 관리의 적절한 방법
- 6. 봄 mvc
- 7. 봄 여러 트랜잭션 관리 문제
- 8. 봄 트랜잭션 다중 데이터 소스
- 9. 그루비와 봄 같은 트랜잭션 아래
- 10. Hiberante 검색 및 인덱싱 된 내장 모음
- 11. 봄 MVC 처리 양식 채우기 및 제출
- 12. 봄 MVC + 세션 속성 및 여러 탭
- 13. 봄 mvc 휴식 및 다른 질문으로 답변하기
- 14. 봄. 봄 (최대 절전) 트랜잭션을 사용하는 DB 트랜잭션 관리
- 15. 봄 2.5 MVC에서 봄 3.0 MVC
- 16. 봄 MVC 웹 위젯
- 17. 봄 루 MVC : 객체
- 18. 봄 MVC URL 매핑
- 19. 봄 mvc 선택 버튼
- 20. 봄 MVC 여러 @RequestMappings
- 21. 봄 MVC 3 SimpleFormController
- 22. 봄 mvc 서블릿 초기화
- 23. 봄 MVC - 선택적인 포맷팅
- 24. 봄 MVC repsonsebody
- 25. 봄 MVC 드롭 다운리스트
- 26. JDOM 예외 봄 MVC
- 27. 봄 MVC JNDI
- 28. 봄 MVC htmlspecialchars() 대체
- 29. 봄 MVC 아랍어 언어
- 30. 봄 mvc 체크 박스
또한 잘못된 것입니다. Hibernate는 기본적으로 낙관적 인 잠금으로 설정되어 있으므로 "정상적으로 작동하지 않습니다". –
@ Ryan Stewart 낙관적 인 잠금이란 무엇입니까? u는 조금 설명 할 수 있습니까 ?? – curiouss
나는 낙관적 인 자물쇠를 찾고 그것을 발견 : 낙관적 인 접근 방식은 항상 모든 것이 괜찮을 것이라고 가정하고 상충되는 데이터 수정은 거의 없다고 가정합니다. 낙관적 동시성 제어는 데이터가 기록되는 작업 단위의 끝에 만 오류를 발생시킵니다. 다중 사용자 응용 프로그램은 일반적으로 낙관적 동시성 제어 및 읽기 커밋 된 격리 수준의 데이터베이스 연결을 기본으로합니다. 추가 격리 보증은 적절한 경우에만 획득됩니다. 예를 들어, 반복 가능한 읽기가 필요할 때. 이 방법은 최상의 성능과 확장 성을 보장합니다. – Jacky