管理并发访问

时间:2016-12-20 10:01:24

标签: jpa java-ee concurrency

我有一个管理员工列表的应用程序。应用程序中的用户(管理员)可以创建和编辑这些员工。我希望在其他用户正在编辑他时锁定员工的编辑权限。

我发现我可以使用乐观并发,所以当第二个用户尝试编辑它时,他不能。这种解决方案的缺点是用户可以浪费时间编辑员工(特别是如果有很多参数需要编辑),当他点击编辑按钮时,他将获得用户在他之前编辑的新版本。

所以我正在寻找一种方法来管理代码中的并发访问而不是JPA.Like如果用户想要访问员工X的编辑页面,他将收到用户ADMIN2现在正在编辑该员工的消息。当ADMIN2仍在编辑用户时,他无法访问编辑员工。

是否有任何标准可用于管理此类并发访问。如果不是,您认为我如何管理这种并发访问?

2 个答案:

答案 0 :(得分:1)

在JPA中没有内置方法可以做到这一点。 JPA2确实支持pessimistic locking,但这是一个与事务相关联的概念,因此不是您需要的概念。

另外你实际上并不想这样做,如果你大约10年前,当(某些)源控制系统使用悲观锁定('好老源安全)时,你会知道为什么这是一个坏主意相比现代的Git。

您真正需要的是一种合并并发更改的方法,就像git合并冲突一样。而不是丢弃用户的更改(当乐观锁插入失败时),您将修改后的版本和当前版本从数据库发送回UI,让用户合并这两个版本,然后再次保存。

您还可以全面了解历史/审核,EclipseLinkHibernate 都可以存储同一实体的多个版本(基本上就像Git一样),因此您可以跟踪更改。我知道你的JPA方式,并且拥有一个优秀的用户体验设计师,有可能建立一个比任何悲观锁定都要好得多的系统 - 即使你试图使用'编辑'栏建立悲观锁定,你仍然会如果两个用户同时单击同一资源的编辑按钮,则需要使用乐观锁定。 ; - )

答案 1 :(得分:0)

如果你真的想要实现,你所描述的,我会在相应的表中添加一个editing列,标记编辑开始。然后在开始编辑之前,检查此布尔值并根据您的消息进行操作。换句话说:在数据库级别上这样的锁定几乎不可能在多个事务中进行并且存在危险(我认为编辑员工是一个漫长的过程,远远不是在同一事务中处理)并且您最好实现它自己(保存后或取消后不要忘记删除editing布尔值。