繁体   English   中英

如何防止两个用户对 web 应用程序中的数据记录执行相同的操作?

[英]How to prevent two users from taking same action on a data record in a web application?

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

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

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

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

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

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

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

至于如何使用乐观锁,网上有很多不错的教程。 我首先检查您使用的 Spring 和 JPA 实现的参考手册。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM