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

时间:2009-09-07 06:58:44

标签: design-patterns user-interface locking

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

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

  • 悲观锁定:在大多数情况下我需要等待会话超时才能释放锁定的网络环境很困难。
  • 乐观锁定:在用户友好性方面不是那么好,因为用户可能会填写大型表格,但最后只会收到“无法保存”的消息。

有什么建议吗?

4 个答案:

答案 0 :(得分:3)

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

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

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

  • 预订您想要的记录

    现在更新RESERVATION_TIME,其中KEY = id和RESERVATION_TIME超过30分钟前

仅当最近没有人设置了更新时,此功能才有效。我们的想法是,如果其他用户已经在工作,我们甚至不允许填充编辑屏幕。但是我们将预约设定为在30分钟(或其他)之后过期,以便没有任何东西被“锁定”。但请注意,我们不是(在数据库方面)持有悲观锁定。

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

  • 回写
  • 检查乐观谓词并在很久以前清除预订。

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

其他一些想法:

  1. 上次保存获胜 - 对于某些数据,锁定没有意义。你打算允许用户Bill改变Alice的工作,反之亦然,所以要么赢得胜利。
  2. 检测冲突和合并。像CVS源控制系统一样。使用乐观方案,如果发生冲突,则介绍干预更新和建议的更新,并要求用户解决冲突。

答案 1 :(得分:1)

我们在类似的情况下(或乐观锁定)实现第一个写赢机制

<强> BACKEND:

在数据库中创建一个时间戳字段(这在INSERT和UPDATE的MSSQL中自动更新)

当您加载要编辑的对象(包括时间戳属性)时,只允许在存储过程中保存,如果时间戳相同则抛出错误,在应用程序中处理此操作以指示记录已更改并为其提供机会重新加载页面。这适用于Web /断开连接的环境。

前端

页面需要轮询数据库(使用ajax)来检测更改。如果存在更改提示,则指示记录已更改的用户以及重新加载/合并的选项。在页面上回发显示标签或次要表单字段(只读),右侧可以复制新输入的值,例如左侧的箭头按钮将值复制回原始表单字段。

答案 2 :(得分:0)

我同意你的看法,乐观锁定并不是用户友好的。

对于悲观锁定,我认为你可以克服这个问题:

  • 要更频繁地释放锁定,您可以在数据库中使用delai进行锁定。在delai到期之后,另一个用户可以打破锁定。第一个用户将收到通知。这需要从一开始就明确。

  • 您还可以在锁定页面中使用重复的自动刷新。在每个(ajax)请求中,您记住时间。因此,如果在服务器上,锁定的时间早于刷新率,则表示用户不再在此页面上。所以即使会话没有过期,你也可以清理锁。

答案 3 :(得分:0)

您可以通过检索已修改的记录并显示与他们提交的数据的比较来使用户友好锁定。

你可以更进一步,实现类似TortoiseSVN的界面来编辑冲突(如果有的话)。

这可能需要一些UI工作,但这会产生一种允许并发编辑的好方法。

您可能需要查看Rietveld中使用的HTML / JS / CSS代码,作为如何创建nice diff interface的示例。