用于并发修改的Web前端设计

Zec*_*tes 5 user-interface design-patterns locking

我正在创建一个具有一些管理屏幕的Web应用程序,用户可以在其中编辑记录(例如,更改用户的联系人详细信息).对这些管理屏幕的访问由角色控制,多个用户可能具有访问权限.现在出现的问题是如果两个用户同时尝试编辑同一记录该怎么办.

我的问题在于前端,而不是后端.我可以使用哪些模式来设计我的页面,以便用户友好并防止并发修改?我能想到的唯一两个选择是这些:

  • 悲观锁定:在大多数情况下,在能够释放锁定之前我需要等待会话超时的Web环境中很困难.
  • 乐观锁定:在用户友好性方面不是那么好,因为用户可能会填写一个大型表单,但最后只会遇到"无法保存"的消息.

有什么建议?

djn*_*jna 3

定时预约怎么样?这是许多在线预订系统中使用的模型。

基于简单单表情况的示例(我希望扩展到更多表应该是显而易见的)向名为 RESERVATION_TIME 的表添加一列。所有记录最初都填充有“许多年前”的预订时间。

将此与乐观锁定结合使用。当您进入编辑模式时,您

  • 预约您想要的记录

    将 RESERVATION_TIME 更新为 NOW,其中 KEY = id 且 RESERVATION_TIME 已超过 30 分钟前

仅当没有人最近设置更新时,此功能才有效。我们的想法是,如果其他用户已经在工作,我们甚至不允许填充编辑屏幕。但我们将该保留设置为在 30 分钟(或其他时间)后过期,这样就不会永久“锁定”任何内容。但请注意,我们并没有(用数据库术语)持有悲观锁。

  • 现在检索数据(也许是与预订相同的 tran)

  • 写回时检查乐观谓词并清除很久以前的保留。

现在,这在任何支持预订系统的应用程序的两个用户之间进行调解。乐观锁在系统的所有乐观用户之间进行调解,因此用户仍然可能会感到恼火,但假设带外更新很少见,那么您应该获得可接受的可用性。

其他一些想法:

  1. 最后保存获胜 - 对于某些数据来说,锁定是没有意义的。无论如何,您将允许用户 Bill 更改 Alice 的工作,反之亦然,因此允许任一者获胜。
  2. 检测冲突并合并。就像CVS源代码控制系统一样。使用乐观的方案,并在发生冲突时呈现干预更新和建议的更新,并要求用户解决冲突。