0
1 단계 하나 개의 스레드에서, 나는 최대 절전 모드 세션에서 DB에서 ID 1 직원을 가져 세션을 닫습니다최대 절전 모드에서 기본적으로 낙관적 잠금이 작동합니까?
내가 세션 2, Upadted ID 1의 직원 이름
3 단계 시작 2 단계 지금 다시 스레드 1, 나는 때문에 버전이 스레드 2. 왜으로 업데이트되었습니다 사이에 동시 업데이트 예외를 expectind 된 최대 절전 모드 세션 을 열 instance.Then 분리에 직원 이름을 변경하고
dB
에서 EMP 업데이트 그것 되지 않습니다 던져? 나는 어떤 개념을 여기에서 놓치고 있다고 생각하지만 확실하지 않다.여기에 관련 코드는 다음과 같습니다 -
스레드 1
Step 1
Employee Employee1=(Employee)session.get(Employee.class, 1);
session.close();
Step 2
// Start new Thread i.e Thread 2 and update Employee in between
Makes sure thread 2 is done before proceeding to step3
Step 3
Employee.setName("EmployeeUpdated");
session = factory.openSession();
tx = session.beginTransaction();
session.update(Employee);
tx.commit();// expect the concurrent update here
session.close();
스레드 2
Thread(SessionFactory factory){
this.factory = factory; // same factory as used in Thread1
}
public void run() {
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
Employee Employee1=(Employee)session.get(Employee.class, 1);
tx.commit();
session.close();
session = factory.openSession();
tx = session.beginTransaction();
Employee1.setName("EmployeeUpdatedByThread2");
session.merge(Employee1);
tx.commit();
session.close();
}
최대 절전 모드 마십시오 갱신하면서 버전을 확인하기 위해 EXPLICT 구성이 필요?
Employee 엔티티를 게시하여 @Version으로 주석 된 적절한 속성이 있는지 확인할 수 있습니까? –
모든 속성에 @Version 주석을 추가하지 않았습니다. 내부적으로 최대 절전 모드로 전환하지 마십시오 (최대 절전 모드에서 명시적인 @version과 같은 질문에 따라)? 나는 hibernate가 어떤 명시 적 주석/설정 설정없이 자동적으로 버전 체크를하는지 인상을 받고있다. 나는 틀릴 수도 있습니다. –
@Alex 당신 말이 맞습니다. Hibernate는 기본적으로 optimistic 잠금을 지원하지 않는다. http://stackoverflow.com/questions/6909035/how-to-do-optimistic-locking-in-hibernate도 도움이되었습니다. –