2014-10-13 4 views
0

현재 JPA에서 엔티티를 잠그는 데 문제가 있습니다. 데이터베이스의 여러 엔티티 목록이 있습니다. 각 요소에는 해당 항목을 편집하기위한보기를로드하는 편집 단추가 있습니다. 클라이언트가 항목을 편집하려고 할 때마다 엔티티가 잠겨 있는지 확인하여 클라이언트가 엔티티의 편집 마스크를로드하는 것을 방지합니다. 엔티티를로드엔티티 잠그기

내 방법 :

[...] 
mail = (EMailKonto) query.getSingleResult(); 
System.out.println(getLock(mail).toString()); 
setLock(mail, LockModeType.PESSIMISTIC_WRITE); 
System.out.println(getLock(mail).toString()); 

호출 된 방법 :

public void setLock(T entity, LockModeType lock) 
{ 
getEntityManager().lock(entity, lock); 
} 

public LockModeType getLock(T entity) 
{ 
    return getEntityManager().getLockMode(entity); 
} 

무슨 일이 이후 처음 syso를 인쇄 없음, 어떤 잠금이 적용되지 것입니다. 그런 다음 잠금이 설정되고 두 번째 syso가 PESSIMISTIC_WRITE를 인쇄합니다. 페이지를 새로 고치거나 다른 탭/브라우저를 사용하여 같은 엔티티의 편집 버튼을 클릭하면 잠금을 제거하지 않으므로 첫 번째 syso가 PESSIMISTIC_WRITE를 인쇄해야하지만 NONE이 다시 인쇄됩니다. 그런 종류의 기능을 구현하는 방법을 이해하도록 도와 줄 수 있습니까?

안부

+0

(저는 Glassfish 3.X와 MySQL InnoDB 테이블을 사용하고 있습니다) –

답변

2

기술적는 비관적 잠금은 다른 트랜잭션의 다른 SELECT ... FOR UPDATE뿐만 아니라 UPDATE 실패되도록 현재 트랜잭션에 대한 행을 잠그는 SELECT ... FOR UPDATE 명령을 실행을 통해 구현된다.

모든 트랜잭션 수준 잠금은 트랜잭션이 끝날 때 해제되므로 클라이언트가 행을 편집하는 동안 트랜잭션을 유지해야하기 때문에 이러한 기능을 구현할 수 없습니다. 그것은 무거운 클라이언트 (하지만 끔찍한 디자인)에서 실현 가능하지만, 웹 응용 프로그램에서 클라이언트가 브라우저를 닫으면 의견이 없기 때문에 현실적이지 않습니다.

'잠금'을 별도의 테이블에 저장하여 비즈니스 레벨에서 수동으로 잠금을 구현하고 관리해야합니다. 트랜잭션 레벨 (비관적) 잠금은 이 아니고은 비즈니스 레벨 잠금 기능을하도록 설계되었습니다. 그들은 낮은 수준 트랜잭션 일관성을 주장하도록 설계된 메커니즘입니다.