防止并发修改。 Eclipselink(OptimisticLockException)

时间:2013-08-21 10:19:06

标签: jpa eclipselink ejb-3.0 optimistic-locking

问题:

两个管理员 - > Admin1和Admin2同时修改不同终端的UserA。

User和UserGroup实体之间存在多对多关系。

这里发生的事情是当Admin1将Group1分配给UserA时,信息被保存。 当来自不同终端的Admin2将Group2分配给UserA时,保存的信息会覆盖Admin1所做的更改。表示我在签入数据库时​​,UserA被分配到Group2,而Admin2不知道Admin1所做的更改。

  1. 这是乐观的情况吗?
  2. 如果这是乐观情况那么为什么不抛出OptimisticLockException?
  3. 如何通知Admin2 Admin1所做的更改。
  4. 使用如下的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注释标记在版本列上,该列在每个操作上都会更新。

    请知道您是否需要我方提供更多信息。

1 个答案:

答案 0 :(得分:0)

将group1分配给user1时,保存上次修改的时间戳。下次请求获取user1详细信息时,请确保提供上次修改日期以及其他详细信息。当admin1修改请求时,请求他提供您在get操作期间提供的相同的最后修改日期。在保存请求请求之前,将上次修改日期与您提供给admin1的日期进行比较。基本上这里最后修改日期是一种令牌。您存储令牌,为访问数据的用户提供相同的令牌,然后当用户修改数据并将其发送以进行持久操作时,请确保数据库中的令牌与用户已发回给您的令牌相匹配,这意味着该记录已被修改并且令牌在数据库中更改,不允许用户持久存储错误数据。

希望这有帮助。