有效地验证自加载后页面上的数据是否未被其他人更改?

时间:2019-05-07 21:04:54

标签: javascript html forms validation yii

我们有一个页面,其中包含许多用户可编辑的数据,这些数据是从数据库中的各个表填充的。数据具有所有不同的形式,下拉列表,复选框,输入框,文本区域等...

存在一些冲突,其中两个用户大约同时加载一条记录,一个进行更改,然后另一个进行一组更改。当他们保存时,他们并不知道其他人进行了更改,并且可能刚刚破坏了他们所做的更改或覆盖了他们的更改。

我正在尝试实施一种解决方案来缓解此问题,例如,当其他人更改数据时,向用户显示错误。

我想知道是否有最佳实践方法来检查此问题?我有一些想法

  • 同时提交字段中存在的“当前”数据和“原始”数据。然后检查更改的内容并在数据库中进行比较,以查看默认值是否与当前保存的内容不同。这会起作用,但似乎对性能的要求最低。
  • 使用jquery / javascript检测何时编辑了某个字段,如果该字段已从defaultValue更改,则设置一个隐藏字段,该字段将被提交以指示其原始值。然后它会像以前的想法一样做。
  • 设置一个隐藏字段,其时间戳为用户加载页面的时间。当他们提交时,请使用该时间戳记并检查我们的历史记录表以查看自该时间戳记以来页面上的任何数据是否已更改。这似乎是最有效的想法,而且可能最容易实现。

是否有更好的选择或最佳实践方法?我觉得自己在重新发明一个常见问题。

1 个答案:

答案 0 :(得分:2)

您正在解决一个常见问题。但这很常见,因为它需要如此频繁地反复解决。 “乐观的记录锁定”是您前进的道路。看起来yii(我不熟悉)具有合并处理此功能的功能。我找到了this link

yii基础结构是为您执行此操作,还是必须自己构建它,您想要做的事情(以支持Optimistic Record Locking)如下:

  1. 在将数据检索到客户端时,请保留并保留数据的不变副本。
  2. 客户必须将更改以及未更改的数据副本提交回服务器。
  3. 服务器的“更新”例程将未更改的例程进行比较 复制到当前记录。如果已更改某些内容,则必须 返回错误消息和“新”当前记录。
  4. 如果未进行任何更改,则服务器将执行更新。

替代方法是悲观记录锁定,您可以签出。由于存在其他问题,我会避免使用它,但是在某些情况下它更合适。