你如何锁定在线表格?

时间:2009-01-08 12:24:53

标签: java-ee

我们有一个基于传递的表单的Web应用程序。不幸的是,当人们看到它时,它是可编辑的。因此,两个人可以同时编辑它并覆盖他们的更改。您如何将表单(以及同一表单的任何多个部分,因为它分解为多个页面)向下锁定,这样一次只能有一个人编辑它?

我们只希望他们能够一次性编辑表格半小时(他们可以保存并继续增加更多时间)。


我有一个解决方案,但我想看看其他人的想法。

在我的解决方案中,当用户首先查看表单(或表单的任何部分,因为有多个部分都需要锁定)时,没有任何字段可以编辑,直到它们点击编辑按钮。一旦他们点击编辑按钮,就会输入一个标记,其中包含用户ID和开始时间。然后将它们重定向到可编辑的相同表单。页面底部会有一个javascript计时器,让他们知道他们还剩多少时间。完成后,他们点击“保存并退出”按钮保存更改,为其他用户解锁表单,然后返回到不可编辑的表单。为了避免使用后退按钮返回可编辑的表单,我认为将使用包含javascript重定向的中间页面。因此,如果他们点击后退按钮,他们将被重定向回当前页面。

如果他们想要编辑其中一个子表单(有些按钮可以将它们从主表单重定向到子表单),他们只需在编辑模式下单击其中一个按钮,它就会保存大表单,更新给他们另外半个小时的时间,并将他们重定向到可编辑的子表单。

当用户尝试查看当前正被其他用户编辑的表单时,编辑按钮将显示为灰色,并且将显示当前用户的信息以及 的时间>打开备份,但用户在保存和编辑子表单时可以更改此时间。


这听起来像是一个可行的解决方案吗?如果必须做同样的事情,请让我知道你的问题的解决方案是什么?

2 个答案:

答案 0 :(得分:5)

有很多方法可以解决这种情况。一个是锁定表单,一次只允许一次编辑。另一种方法是在保存和警告用户时检测碰撞。

锁定对于具有高争用的资源最有用。如果预计会发生许多冲突,那么使用户单击编辑按钮效果最佳。这应该将记录标记为锁定在您的数据存储区中,并且应该只允许一个用户编辑它。当用户保存记录或用户取消时,需要解锁记录。在网页等断开连接的情况下,一段时间后也应该自动解锁。

通过记录修订号或最后编辑的日期时间并在查看页面时将其传递给客户端来完成碰撞检测。然后,客户端在命中save时将其传递回服务器,并根据数据库中的值进行检查。如果值已更改,则其他人已编辑该记录,并且可以向用户发出警告。这个系统对于小编辑更有效,并且当资源不太可能在别处编辑时(通常情况下,与活跃用户数相比有许多小记录)。

我发现检测到碰撞效果更好,并且对于Web应用程序中的用户来说不那么令人沮丧。只要他们输入的文字足够小。这是因为锁定资源可以比它需要的时间更长,这是非常令人沮丧的

答案 1 :(得分:1)

这是一个可行的解决方案,对可见的管理开销有点沉重,但可能是最合适的解决方案,具体取决于您的预期工作流程。

其他方法包括:

一个。允许任何人编辑和提交表单,但如果其他人在表单最初打开之间的时间之间也提交了更改,则回复“冲突”错误。要在必要时进行改进,请显示两组不同的更改,并允许用户选择要应用的更改,或尝试合并更改。

湾使表单作为即时效果编辑器工作,没有“保存”按钮。使用XMLHttpConnection将表单上的所有打开视图保持最新,以便当一个用户对任何字段进行更改时,可以在其他任何人的表单副本上即时更新。