2014-03-05 2 views
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 구성이 필요?

+0

Employee 엔티티를 게시하여 @Version으로 주석 된 적절한 속성이 있는지 확인할 수 있습니까? –

+0

모든 속성에 @Version 주석을 추가하지 않았습니다. 내부적으로 최대 절전 모드로 전환하지 마십시오 (최대 절전 모드에서 명시적인 @version과 같은 질문에 따라)? 나는 hibernate가 어떤 명시 적 주석/설정 설정없이 자동적으로 버전 체크를하는지 인상을 받고있다. 나는 틀릴 수도 있습니다. –

+0

@Alex 당신 말이 맞습니다. Hibernate는 기본적으로 optimistic 잠금을 지원하지 않는다. http://stackoverflow.com/questions/6909035/how-to-do-optimistic-locking-in-hibernate도 도움이되었습니다. –

답변

0

낙천적 인 잠금 기능을 사용하려면 객체 아래의 버전 속성에 @Version을 추가해야합니다 (낙관적 잠금을 사용하도록 설정해야합니다).이 Link은 많은 도움이되었습니다.

관련 문제