2013-08-21 5 views
1

문제점 :동시 수정 금지. Eclipselink (OptimisticLockException)

두 개의 Admins -> Admin1 및 Admin2 두 개의 터미널에서 동시에 UserA 수정.

User와 UserGroup 엔터티 사이에 개의 many-to-many 관계가 있습니다. 이 있습니다.

여기서 Admin1이 User1에 Group1을 할당하면 정보가 저장됩니다. 다른 터미널의 Admin2가 Group2를 UserA에 할당하면 정보는 저장되지만 Admin1이 변경 한 내용을 덮어 씁니다. DB에 체크인 할 때 User2는 Admin2가 Admin1의 변경 사항을 인식하지 못하는 동안 Group2에 할당됩니다.

  1. 낙천적 인 상황입니까?
  2. 이것이 낙관적 인 상황이라면 왜 이것이 OptimisticLockException을 던지지 않는가?
  3. Admin2가 Admin1의 변경 사항을 어떻게 알리는 지 어떻게 알 수 있습니까? EclipseLink가 사용

아래와 같이

@ManyToMany 
    @JoinTable(name = "user_group", joinColumns = { @JoinColumn(name = "user_group_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }) 
    private List<User> userList; 

    @ManyToMany 
    @JoinTable(name = "user_group",joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "user_group_id", referencedColumnName = "id") }) 
    private List<UserGroup> userGroupList; 

@Version 주석은 각 조작 갱신되는 버전 열 위에 표시된다.

내 측면에서 더 많은 정보가 필요하면 알려주십시오.

답변

0

group1이 user1에 할당되면 마지막으로 수정 된 시간 소인을 저장하십시오. 다음에 user1 세부 정보를 요청할 때 다른 세부 정보와 함께 마지막으로 수정 한 날짜를 제공했는지 확인하십시오. admin1이 요청을 수정하면 작업을 수행하는 동안 제공 한 것과 동일한 마지막 수정 날짜를 제공하도록 요청합니다. requestrequest를 저장하기 전에 admin1에 제공 한 것과 동일한 마지막 수정 날짜를 비교하십시오. 기본적으로 여기서 마지막으로 수정 한 날짜는 일종의 토큰입니다. 토큰을 저장하고 데이터에 액세스하는 사용자에게 동일한 토큰을 제공 한 다음 사용자가 데이터를 수정하고 지속 작업을 위해 전송할 때 데이터베이스의 토큰이 사용자가 다시 보낸 토큰과 일치하는지 확인합니다. 이는 사용자가 레코드를 수정했음을 의미합니다. 토큰은 databse에서 변경되며 사용자가 불량 데이터를 유지할 수 없습니다.

희망이 도움이됩니다.