javascript - 有效地验证页面上的数据在您加载后没有被其他人更改?
问题描述
我们有一个页面,其中包含许多用户可编辑的数据,这些数据是从数据库中的各种表中填充的。数据有各种不同的形式、下拉菜单、复选框、输入框、文本区域等......
有一些冲突,两个用户大约在同一时间加载一条记录,一个进行更改,然后另一个进行一组更改。当他们保存时,他们不知道其他人进行了更改,并且可能刚刚破坏了他们所做的更改或覆盖了他们的更改。
我正在尝试实施一种解决方案来缓解此问题,例如在其他人更改数据时向用户闪烁错误。
我想知道是否有最佳实践方法来检查此问题?我的一些想法是
- 提交字段中存在的“当前”数据和“原始”数据。然后检查哪些已更改并在数据库中比较它们以查看默认值是否与当前保存的不同。这会起作用,但似乎对性能最不友好。
- 使用 jquery/javascript 检测字段何时被编辑,如果它已更改,
defaultValue
则设置一个隐藏字段,该字段将被提交以指示其原始值。然后它会做类似于之前的想法所做的事情。 - 设置一个隐藏字段,其中包含用户加载页面的时间戳。当他们提交时,使用该时间戳并检查我们的历史记录表以查看页面上的任何数据自该时间戳以来是否已更改。这似乎是最有效的想法,并且可能最容易实现。
有没有更好的选择或最佳实践方法来做到这一点?我觉得我正在为一个常见问题重新发明轮子。
解决方案
您正在解决一个常见问题。但它很常见,因为它需要如此频繁地反复解决。“乐观记录锁定”是您前进的道路。看起来 yii(我不熟悉)有能力处理这个问题。我找到了这个链接。
无论 yii 基础设施为你做这件事,还是你必须自己构建它,你想要做的(支持 Optimistic Record Locking)如下:
- 当您将数据检索给客户时,制作并保留未更改的数据副本。
- 客户端必须将更改连同未更改的数据副本一起提交回服务器。
- 服务器的“更新”例程将未更改的副本与当前记录进行比较。如果某些内容已更改,则它必须返回错误消息和“新”当前记录。
- 如果没有任何更改,则服务器进行更新。
另一种方法是悲观记录锁定,您可以查看它。由于它存在其他问题,我避免使用它,但在某些情况下它更合适。
推荐阅读
- python - 我怎样才能在python中实现这个?
- c# - Unity中如何知道电话是否在通话?
- java - 处理一个 JFrame
- python - 有没有更自动化的方法来发现子字符串?
- v8 - SetAccessor 和 SetAccessorProperty,有什么区别?
- python - 在这种情况下如何打印 valueError
- rust - 调用借用不可变的闭包时,不能在循环中借用可变的?
- ios - 应用程序在 CLClientStopVehicleHeadingUpdates 上崩溃
- python - 使用 url 标签时的问题
- javascript - summernote 添加额外内容