2013-08-21 1 views
1

Задача:Предотвращение одновременной модификации. Eclipselink (OptimisticLockException)

Два администратора -> Admin1 и Admin2 Одновременное изменение UserA с разных терминалов.

Существует отношение многих к большому числу между субъектом User и UserGroup.

Здесь происходит то, что Admin1 назначает Group1 UserA, информация сохраняется. И когда Admin2 с другого терминала назначает Group2 на UserA, информация сохраняется, но перезаписывает изменения, внесенные Admin1. Значит, когда я проверяю DB, UserA назначается Group2, а Admin2 не знает об изменениях, внесенных Admin1.

  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

Если группе 1 назначен пользователь1, сохраните последнюю измененную метку времени. В следующий раз, когда запрос поступит для получения сведений о пользователе1, убедитесь, что вы предоставили последнюю измененную дату вместе с другими подробностями. Когда admin1 изменяет запрос, попросите его предоставить ту же последнюю измененную дату, которую вы предоставили во время операции получения. Сравните последнюю измененную дату так же, как и предоставленную администратору, перед сохранением запроса requestquest. В основном здесь последняя измененная дата - это своего рода токен. Вы сохраняете токен, предоставляете то же самое пользователю, который обращается к данным, а затем, когда пользователь изменяет данные и отправляет их для продолжения работы, убедитесь, что токен в базе данных соответствует одному пользователю, отправленному вам обратно, это означает, что запись была изменена и токен изменен в databse и не позволяет пользователю сохранять плохие данные.

Надеюсь, это поможет.