java - 如何防止两个用户对 Web 应用程序中的数据记录执行相同的操作?
问题描述
我们有一个由 Spring 框架支持的 Web 应用程序,它向用户显示记录列表。我们有一个要求,我们希望限制两个用户同时操作单个记录。即,如果多个用户试图对同一记录进行操作,则对首先处理哪个操作的用户的请求其余都不应处理它。
我们已经研究了锁定技术(乐观锁定),但不确定这是否是实现此功能的正确方法或唯一方法。
此外,如果乐观锁定是正确的方法,那么任何指向该方向的指针都会受到赞赏。
解决方案
乐观锁定确实是解决这个问题的常用技术,它完全符合您的要求:如果多个用户想要同时执行冲突的操作,只有第一个这样的操作成功,而其他所有操作都被拒绝。将此与通知其他用户他们的请求失败,因为其他人更快,并让他们选择查看其他用户所做的操作相结合,可以让他们协调他们的更改,并在必要时重试。
乐观锁定的优点是它仅在发生实际冲突时才会生效。如果冲突很少,这是最佳的,这就是为什么这种技术被称为“乐观”锁定。
乐观锁定的缺点是它会在发生冲突时丢弃用户工作。如果冲突频繁,并且提交的工作很重要,那么简单地丢弃该工作可能太浪费了。此外,有时这项工作除了更新必须只发生一次的数据库之外,还会产生副作用。例如,工作可能涉及发送一封信或电子邮件,在乐观锁定失败的情况下无法召回。
在这些情况下,您需要防止用户开始有冲突的工作,而不是等到他们希望保存他们的工作。这通常是通过允许用户在开始实际工作之前在应用程序级别获得问题的所有权来实现的。结合确保只有一个用户可以同时获得所有权(通过乐观锁定),这可以防止开始冲突的工作。这种技术的缺点是即使结果没有冲突,用户也需要采取额外的行动,因此这优化了冲突代价高昂或频繁发生的情况。
至于如何使用乐观锁,网上有很多不错的教程。我首先检查 Spring 的参考手册和您使用的 JPA 实现。
推荐阅读
- javascript - react-native-navigation V3 使应用程序崩溃
- android - 如何在 Android Camera API 2 中使用零快门延迟?
- linux - 对 `ldap_msgtype@OPENLDAP_2.4_2' 和许多其他的未定义引用
- spring-security - 如何在本地网络企业中配置 Ldap 认证?
- vue.js - 动态创建 vue 组件
- react-native - 打印反应原生文本和 QR 生成
- java - 在 Android 导航架构中,如何从主机(活动)调用目标片段的方法之一
- javascript - 获取两个元素之间的内容
- java - 授予权限后权限被拒绝
- amazon-web-services - jenkinsfile - 将文件复制到 s3 并公开