2016-07-30 2 views
1

JPA 잠금 (낙관적 및 비관적) 원칙을 이해했지만 엔티티 관리자, 쿼리 등에 적용한 모든 잠금은 항상 서버 측에 있음을 알았습니다. 모든 EJB는 서버에 있으므로 트랜잭션이 사용하는 트랜잭션도 서버에서 잠 깁니다.웹 구성 요소에서 JPA 잠금 사용

귀하의 전자 상거래 웹 사이트 사용자는 자신의 데이터를 변경하려고합니다. 사용자는 클라이언트 (예 : facelets)의 변경 사항을 채운 다음 서버로 전송하여 제출하여 잠금을 얻습니다. 그러나 관리자가 초기 읽기와 잠금 획득 전에 costumers 데이터를 변경 한 경우 어떻게해야합니까? 이로 인해 더러워진 결과가 발생합니다.

그럼 어떻게 잠금 계층을 웹 계층으로 확장 할 수 있습니까?
웹에서 옵션을 찾지 못했지만 JPA의 현재 잠금 API가 없으면 쓸모가 없습니다.

답변

0

더티 읽기를 방지하기 위해 엔티티를 차단하지 않고 엔티티 클래스에 @Version 속성을 추가하는 "버전 잠금"이라는 JPA 기능을 사용할 수 있습니다. 간단한

예 : 누군가가 전에 데이터를 업데이트하고 데이터를 업데이트하려고하면

@Entity 
public class Persona implements Serializable { 
    //... other properties 

    @Version 
    @Column(name="VERSION") 
    private long version; 

// getters and setters 
} 

지금, JPA 엔진이 다른 사람과 정보를 업데이트 할 것을 나타내는 예외를 throw합니다. 이 옵션은 전체 응용 프로그램의 성능 저하를 초래할 수있는 막힘을 방지합니다.

+0

감사하지만 낙관적 인 잠금 개념에 익숙합니다. 문제는 JPA가 각 트랜잭션이 끝날 때 변경 사항을 확인한다는 것입니다. 글쎄, 이것은 더티 읽기에 대한 보호를 제공하지만 트랜잭션 시간 동안에 만 가능합니다. 아무도 다른 사람이 동시에 같은 비트의 데이터를 변경하지 않도록 트랜잭션이 없기 때문에 클라이언트가 브라우저의 데이터를 변경하는 경우이 보안이 부재합니다. – Wecherowski

관련 문제