有效地验证页面上的数据在您加载后没有被其他人更改过?
Efficiently validate that data on a page hasn't been changed by someone else since you loaded?
我们有一个页面,其中包含大量用户 editable 数据,这些数据是从数据库中的各种 table 中填充的。数据以各种不同的形式存在,下拉菜单、复选框、输入框、文本区域等...
发生了一些冲突,两个用户大约同时加载一条记录,一个进行更改,然后另一个进行一组更改。当他们保存时,他们并不知道其他人进行了更改,并且可能刚刚破坏了他们所做的更改或覆盖了他们的更改。
我正在尝试实施一个解决方案来缓解这个问题,例如当数据被其他人更改时向用户显示错误。
我想知道是否有检查此问题的最佳实践方法?我的一些想法是
- 提交字段中存在的 'current' 数据和 'original' 数据。然后检查更改了哪些并在数据库中比较它们以查看默认值是否与当前保存的不同。这可行,但似乎对性能最不友好。
- 使用 jquery/javascript 检测字段何时被编辑,如果它已从
defaultValue
更改,则设置一个隐藏字段,该字段将被提交以指示其原始值。然后它会做类似于以前的想法所做的事情。
- 设置一个隐藏字段,其中包含用户加载页面时的时间戳。当他们提交时,使用该时间戳并检查我们的历史记录 table 以查看自该时间戳以来页面上是否有任何数据发生更改。这似乎是最有效的想法,也可能最容易实施。
有没有更好的选择或最佳实践方法来做到这一点?我觉得我正在为一个常见问题重新发明轮子。
您正在解决一个常见问题。但它很常见,因为它需要如此频繁地反复解决。 "Optimistic Record Locking" 是您前进的道路。看起来 yii(我不熟悉)有能力处理这个问题。我找到 this link.
无论是 yii 基础架构为您做这件事,还是您必须自己构建它,您想要做的(支持乐观记录锁定)如下:
- 当您将数据取回给客户时,制作并保留一份未更改的副本。
- 客户端必须将更改连同未更改的数据副本一起提交回服务器。
- 服务器的'update'例程比较不变
复制到当前记录。如果有什么改变了,那么它必须
return 一条错误消息和 'new' 当前记录。
- 如果没有任何更改,则服务器会进行更新。
备选方案是悲观记录锁定,您可以查看。由于它有其他问题,我避免使用它,但在某些情况下它更合适。
我们有一个页面,其中包含大量用户 editable 数据,这些数据是从数据库中的各种 table 中填充的。数据以各种不同的形式存在,下拉菜单、复选框、输入框、文本区域等...
发生了一些冲突,两个用户大约同时加载一条记录,一个进行更改,然后另一个进行一组更改。当他们保存时,他们并不知道其他人进行了更改,并且可能刚刚破坏了他们所做的更改或覆盖了他们的更改。
我正在尝试实施一个解决方案来缓解这个问题,例如当数据被其他人更改时向用户显示错误。
我想知道是否有检查此问题的最佳实践方法?我的一些想法是
- 提交字段中存在的 'current' 数据和 'original' 数据。然后检查更改了哪些并在数据库中比较它们以查看默认值是否与当前保存的不同。这可行,但似乎对性能最不友好。
- 使用 jquery/javascript 检测字段何时被编辑,如果它已从
defaultValue
更改,则设置一个隐藏字段,该字段将被提交以指示其原始值。然后它会做类似于以前的想法所做的事情。 - 设置一个隐藏字段,其中包含用户加载页面时的时间戳。当他们提交时,使用该时间戳并检查我们的历史记录 table 以查看自该时间戳以来页面上是否有任何数据发生更改。这似乎是最有效的想法,也可能最容易实施。
有没有更好的选择或最佳实践方法来做到这一点?我觉得我正在为一个常见问题重新发明轮子。
您正在解决一个常见问题。但它很常见,因为它需要如此频繁地反复解决。 "Optimistic Record Locking" 是您前进的道路。看起来 yii(我不熟悉)有能力处理这个问题。我找到 this link.
无论是 yii 基础架构为您做这件事,还是您必须自己构建它,您想要做的(支持乐观记录锁定)如下:
- 当您将数据取回给客户时,制作并保留一份未更改的副本。
- 客户端必须将更改连同未更改的数据副本一起提交回服务器。
- 服务器的'update'例程比较不变 复制到当前记录。如果有什么改变了,那么它必须 return 一条错误消息和 'new' 当前记录。
- 如果没有任何更改,则服务器会进行更新。
备选方案是悲观记录锁定,您可以查看。由于它有其他问题,我避免使用它,但在某些情况下它更合适。