【问题标题】:How to prevent two users from taking same action on a data record in a web application?如何防止两个用户对 Web 应用程序中的数据记录执行相同的操作?
【发布时间】:2021-01-01 01:32:09
【问题描述】:

我们有一个由 spring 框架支持的 web 应用程序,它向用户显示记录列表。我们有一个要求——我们希望限制两个用户同时操作单个记录。即,如果多个用户尝试对同一记录执行操作,则请求首先处理哪个操作的用户其余所有操作都不应处理。

我们研究了锁定技术(乐观锁定),但不确定这是否是实现此功能的正确方法或唯一方法。

此外,如果乐观锁定是正确的方法,那么任何指向该方向的指针都会受到赞赏。

【问题讨论】:

  • 其他用户是等待访问还是被完全拒绝访问?
  • @DarkMatter - 在尝试访问记录时通过抛出错误拒绝访问

标签: java spring spring-boot spring-data-jpa


【解决方案1】:

乐观锁定确实是解决这个问题的常用技术,它完全符合您的要求:如果多个用户想要同时执行冲突的操作,只有第一个这样的操作成功,而其他所有操作都被拒绝。将此与通知其他用户他们的请求失败,因为其他人更快,并让他们选择查看其他用户所做的操作相结合,可以让他们协调他们的更改,并在必要时重试。

乐观锁定的优势在于它仅在发生实际冲突时才会生效。如果冲突很少,这是最佳选择,这就是为什么这种技术被称为“乐观”锁定。

乐观锁定的缺点是它会在发生冲突时丢弃用户工作。如果冲突频繁,并且提交的工作很重要,那么简单地丢弃该工作可能太浪费了。此外,有时这项工作除了更新必须只发生一次的数据库之外,还会产生副作用。例如,工作可能涉及发送一封信或电子邮件,在乐观锁定失败的情况下无法撤回。

在这些情况下,您需要防止用户开始有冲突的工作,而不是等到他们希望保存他们的工作。这通常是通过允许用户在开始实际工作之前在应用程序级别获得问题的所有权来实现的。结合确保只有一个用户可以同时获得所有权(通过乐观锁定),这可以防止开始冲突的工作。这种技术的缺点是即使结果没有冲突,用户也需要采取额外的行动,因此这优化了冲突代价高昂或频繁发生的情况。

关于如何使用乐观锁,网上有很多很好的教程。我会先查看 Spring 的参考手册和您使用的 JPA 实现。

【讨论】:

    猜你喜欢
    • 2012-01-05
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2019-09-09
    • 2015-12-29
    • 2010-12-04
    相关资源
    最近更新 更多