首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >面向并发修改的Web前端设计

面向并发修改的Web前端设计
EN

Stack Overflow用户
提问于 2009-09-07 06:58:44
回答 4查看 3.2K关注 0票数 6

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

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

  • 悲观锁定:在web环境中,我需要等待会话超时,然后才能在大多数情况下释放锁。
  • 乐观锁定:在用户友好性方面没有那么好,因为用户可能会填写一个大表单,最后会收到一条“无法保存”的消息。

有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-07 07:02:18

有时间的预订怎么样?这是一个模型,在许多在线预订系统中使用.

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

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

  • 为你想要的记录做个预约 将RESERVATION_TIME更新到30分钟前KEY = id和RESERVATION_TIME的现在

只有当还没有人将up更新设置为最近的时候,这才会起作用。我们的想法是,如果其他用户已经在工作,我们甚至不允许填充编辑屏幕。但是我们把这个预约定在30分钟后就过期了(或者别的什么),这样就没有什么是永久的“锁定”了。但是请注意,我们并不是(从数据库的角度来说)持有悲观的锁。

  • 现在检索数据(可能与预订的tran相同)
  • 在回写时,检查乐观谓词,并将保留清除回很久以前。

现在,这将在遵守预订系统的任何应用程序的两个用户之间进行中介。乐观锁在系统的所有乐观用户之间起中介作用,所以用户仍然有可能被激怒,但是如果你认为带外更新是很少见的,那么你就应该可以获得可接受的可用性。

其他一些想法:

  1. 最后一次保存获胜--对于一些数据来说,锁定是没有意义的。你会允许用户比尔改变爱丽丝的作品,反之亦然,所以让两者都能赢。
  2. 检测冲突并合并。就像CVS源代码控制系统。使用乐观方案,在发生冲突时,提出中间的更新和建议的updat,并要求用户解决冲突。
票数 3
EN

Stack Overflow用户

发布于 2009-09-07 07:11:38

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

后端:

在数据库中创建时间戳字段(在插入和更新时在MSSQL中自动更新)

加载用于编辑的对象(包括时间戳属性)时,只有在时间戳相同的情况下才允许在存储过程中保存,否则会引发错误,请在应用程序中处理这一点,表明记录已更改,并给它们重新加载页面的机会。这在web/断开连接的环境中工作得很好。

前端

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

票数 2
EN

Stack Overflow用户

发布于 2009-09-07 07:12:09

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

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

  • 为了更频繁地释放锁,您可以在数据库中使用delai作为锁。在delai过期后,另一个用户可能会破解锁。将通知第一个用户。这需要从一开始就清楚。
  • 您还可以在锁定页面中使用经常性的自动刷新。在每个(ajax)请求中,您都会记住时间。因此,如果服务器上的锁比刷新速率旧,这意味着用户不再在此页面上。因此,即使会话没有过期,您也可以清除锁。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1387910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档