您如何处理多个用户在Webapp中编辑同一条数据?


26

我正在处理的一个项目正在寻找一个Web应用程序,该应用程序将管理多个用户之间的任务列表。这是一个主任务列表,其任务项由授权用户分发。每个用户都有自己的帐户来登录和查看分配给他们的任务;多个用户可能有一个共同的任务。

我试图将项目的详细信息排除在外,因为我将更多地与如何处理以下情况的整体概念作斗争,但是如果有帮助,我将使用Java,EclipseLink和GWT,并实现RequestFactory。该数据库是PostgreSQL。

因此,我尝试解决的概念性问题如下:

  1. 如果多个用户共有的单个任务以任何方式更改(例如任务完成,删除等),则具有此任务的所有用户的任务列表都将更新。有哪些设计模式可帮助实现此功能?

    • 我查看过的某些模式是“观察员”和“调解员”-在这些模式上是否应该考虑其他模式?
  2. 假设有两个用户同时更改同一任务。

    • 首先,我应该允许这种情况发生还是在某个人完成更改之前将其锁定?

    • 其次,如果不加锁,我该如何调和接受谁的更改?这涉及1中的情况,因为用户1可以提交数据,并且在用户2接收更新的数据之前,他/她可能已经前进并提交了他/她的更改。

我真的在寻找您可以提供的有关如何在此Web应用程序的多个实例之间正确同步数据的任何指导点,建议或技巧。我将不胜感激!

Answers:


17

我认为Whiteboard将是您选择#1的模式,您应该将更改的任务(或其他共享数据)发布到一个公共的位置,以便所有感兴趣的各方都可以看到它们和DTRT。

对于#2,您需要查看乐观锁定。基本上,您需要为所有可编辑的记录加上最后一个更新时间的时间戳。当您尝试保存记录时,首先要验证数据库中的记录具有与您的记录相同的最新时间戳。如果不是,则有人更新了记录,您现在必须获取更新的记录并通知用户他们需要再次输入更改,或者您可以尝试将用户的更改合并到更新的记录中(通常结果是简单或不可能)。


7

我提出了一个桌面应用程序设计(尚未经过完全测试),该设计具有类似的要求,可能会有所帮助。

我的解决方案是采用MVC模式(具有单个Model,但具有多个Controller和View),其中每个Controller使用事务(使用STM)对Model进行更改,并且在提交事务时,Model向View广播更新通知)。

每个客户端还都跟踪任何本地更新的内容,但是当这些本地更新完成(即发送并提交)后,它将恢复为使用基础模型的信息。

我还拥有一个撤消堆栈,其中包含用户所做的所有更改,以便可以还原所有内容。

尽管由于模型必须将更改广播到视图中,这可能不是Web应用程序的最佳模型,而对于Web客户端,这可能不是最简单的。


4

对于1.,您应该查看发布/订阅模式是否更适合。
对于2.这取决于您的情况:

  • 这种情况多久发生一次?
  • 您的一个用户由于任务被锁定或其他人同时更改了任务而无法更新任务的情况有多严重?
    我个人更喜欢一种方法(例如,在ivotaltracker中使用),其中有:
    • 没有锁,
    • 您可以实时看到所有更改,并且
    • 用户界面邀请您进行频繁的次要更新,而不是对多个属性进行较大的更新。
    • 您保留所有已进行更改的历史记录。如果历史记录对用户可见,则最终出现的冲突或覆盖可以通过注释,注释或消息来解决。

这个问题更具学术性,所以我会经常说一下在最坏的情况下如何处理它。+1为模式引用。
hulkmeister

@ kr1ivotaltracker缺少冲突警告,并且不会合并非冲突的更改,因此不应将其用作良好的记录编辑多用户应用程序的一个很好的示例。
爱德华多

0

我的建议是永远不要锁定并报告发生冲突的情况。

请看一下:

https://github.com/spring-projects/spring-petclinic/issues/433

您可以看到视频和示例代码。

会满足您的要求吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.