2010-11-19 2 views
3

Spring과 JPA/Hibernate를 사용하여 비관적 인 오프라인 잠금을 구현하려고합니다. 나는 모든 잠금 (잠긴 레코드의 ID, 타임 스탬프 및 사용자)을 저장하는 데이터베이스에 잠금 테이블을 가지고 있습니다. LockManager 서비스 인터페이스는 다음과 같습니다.비관적 인 오프라인 잠금 (Java, Spring)

public interface LockManager { 

    @Transactional(isolation=Isolation.SERIALIZABLE)  
    public Boolean TestAndGetLock(Application app, User user); 

    public void realeaseLock(Application app, User user); 
} 

메소드 TestAndGetLock은 먼저 레코드에 대한 기존 잠금이 있는지 테스트합니다. 있을 경우 true를 반환하고 종료됩니다. any가 없으면 false를 리턴하고 잠금을 작성합니다 (잠금 테이블에 새 잠금을 작성합니다). 그런 다음에 만 webapp가 실제로 비즈니스 트랜잭션을 시작합니다 (이 경우 매개 변수로 전달 된 응용 프로그램의 편집 양식을 보여줍니다).

이 디자인이 맞는지 말해 줄 수 있습니까? 이름이 더 명확 할 것이다, 그래서 여기에

public boolean lock(Application app, User user); 

public void unlock(Application app, User user); 

:

+0

사용자 정의 격리 수준은 일반적으로 jpa/hibernate 트랜잭션 관리자에서 작동하지 않습니다. – Bozho

+0

왜 그럴까요? 지원되지 않습니까? –

답변

1

나는에 디자인을 수정합니다. 동작은 다음과 같습니다. 클라이언트 코드는 lock()을 호출하고 smth를 잠근 경우 true를 반환하고 그렇지 않으면 false를 반환합니다. API에서 오해를 수정합니다. 성공적으로 스턴을 잠근 경우 왜 false를 반환합니까? 또한 클라이언트 코드를 작성하는 것이 더 간단합니다.

if (lockManager.lock()) { 
... 
} else { 
    throw new LockNotObtainedException() 
} 

두 번째 방법은 제 의견으로는 좋습니다.