2012-09-25 1 views
1

나는 누군가 나를 위해 아래의 scenerio을 명확히 할 수 있기를 바랍니다. 당신은 최대 절전 모드에서 '행'을 요청할 때, 예를 들어, 이해하는 것과최대 절전 모드에서는 충돌을 어떻게 처리합니까?

는 :

User user = UserDao.get(1); 

나는 메모리에 ID = 1을 사용자가 알고있다.

웹 응용 프로그램에서 웹 페이지 두 개가 동시에 사용자를 요청하고로드 한 다음 사용자 개체의 속성을 업데이트하는 경우 어떻게됩니까? 예컨대 :

user.pageViews += 1; // the value is current 10 before the increment 
UserDao.update(user); 

이 인 메모리 인 값을 사용합니다 (모두 요청은 값 10이), 또는 데이터베이스의 값을 사용한다?

답변

2

두 명의 사용자에 대해 두 개의 최대 절전 모드 세션을 사용해야합니다. 즉, 메모리에 오브젝트의 인스턴스가 두 개 있음을 의미합니다. 최대 절전 모드 세션을 하나만 사용하면 (메모리의 개체 인스턴스 하나) 예측할 수없는 결과가 발생합니다.

동시 업데이트의 경우 두 번째 업데이트가 이깁니다. 첫 번째 업데이트의 값은 두 번째 업데이트로 덮어 씁니다. 첫 번째 업데이트의 손실을 피하려면 일반적으로 버전 열 (최대 절전 모드 문서 참조)을 사용하고 두 번째 업데이트는 오류를 가져 와서 반응 할 수 있습니다 (예 : "귀하의 레코드가에서 수정되었습니다. 두 번째 사용자가 수정 된 레코드를 수정하여 다시 저장하면 수정 기호가 손실되지 않도록 할 수 있습니다.

예를 들어 다른보기와 같이 페이지 뷰 카운터의 경우 솔루션은 순차적으로 페이지 뷰를 계산 동기화 방법을 작성할 수 있습니다. 기본적으로

1

in memory 값을 업데이트하는 데 사용됩니다.

를 추적에서 자동 웹 페이지 뷰 카운터를 구현하고 웹 사용자 인터페이스에서 User을 수정하지 않으려한다고 가정합니다. 이걸보고 싶다면 최대 절전 모드 낙관적 잠금을 살펴보십시오.

Session session = ... 
Transaction tx = ... 

session.lock(user, LockMode.UPGRADE); 
user.increasePageViews(); 

tx.commit(); 
session.close(); 

LockMode.UPGRADE이의 변환합니다 : 페이지 뷰를 계산 할 때

그래서, 100 %의 정확도를 필요로 가정하면 당신은 테이블 행에 독점을 얻기 위해 자신의 pageView 값을 수정하는 동안, 당신은 당신의 User 엔티티를 잠글 수 있습니다 데이터베이스의 SELECT ... FOR UPDATE이므로 응용 프로그램 확장성에 영향을 미치지 않도록 잠금을 가능한 한 작게 유지해야합니다.

관련 문제