2012-07-03 3 views
0

엔티티에서 숫자를 증가시키는 SLSB가 있습니다. 두 스레드가 동시에 SLSB에 도달하면 두 요청에서 같은 번호를 얻게됩니다.Stateless Session Bean에서 동시성을 피하는 방법은 무엇입니까?

SLSB이

@Stateless(mappedName = "ejb/CustomerManager") 
public class CustomerManagerBean implements CustomerManager { 
... 
    public String recoverName(int id) { 
     Customer customer = (Customer) em.createQuery("from Customer where id = :id").setParameter("id", id).getSingleResult();  
     int oldValue = customer.getValue(); 
     int newValue = oldValue + 1; 
     customer.setValue(newValue);   
    [BP] return customer.getName() + " value=" + customer.getValue(); 
    } 
... 
} 

법인이

@Entity 
public class Customer implements Serializable { 
    @Id 
    private int id; 
    private int value; 
} 

문제를 테스트하기 위해 추출 추출, 나는 SLSB recoverName 방법에 [BP] 표시 줄에 중단 점을 가지고있다. 그런 다음 두 개의 분리 된 브라우저 페이지에서 두 번 전화를 겁니다. 중단 점에서 두 번 호출에 대한 값은 입니다.

세터가 값을 수정하려고 할 때 어떤 종류의 예외를 던져서는 안됩니까?

내가 (모두 시도)를 AS와 DB로 MySQL 또는 Oracle 도움을

감사로 보스 5를 사용하고

당신이를 추가 한 경우 당신은 플러시 시간에 예외를 얻을 것

답변

4

JPA에서 낙관적 인 잠금을 위해 사용할 @Version annotated 필드를 엔티티에 추가합니다.

JPA는 엔티티를 업데이트 할 때마다 메모리의 버전과 데이터베이스의 버전을 비교하고 일치하지 않으면 예외를 throw합니다. 일치하면 버전이 증가합니다.

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

을 (물론, 데이터베이스에 해당 열을 추가)

+0

그것은 완벽하게 작동 :

은 그냥 당신의 엔티티에 다음을 추가! 대단히 감사합니다 !! – Emiliano

관련 문제