我正在创建一个具有几个管理屏幕的web应用程序,用户可以在其中编辑记录(例如,更改用户的联系人详细信息)。对这些管理屏幕的访问由角色控制,多个用户可能有访问权限。现在出现的问题是,如果两个用户同时尝试编辑相同的记录,该怎么办?
我的问题是前端,而不是后端。我可以使用哪些模式来设计我的页面,以便既对用户友好,又能防止并发修改?我唯一能想到的两种选择是:
有什么建议吗?
发布于 2009-09-07 07:02:18
有时间的预订怎么样?这是一个模型,在许多在线预订系统中使用.
一个基于简单的单表情况的示例(我希望扩展到更多的表应该是显而易见的),在表中添加一个名为RESERVATION_TIME的列。所有记录最初都有“许多年前”的预订时间。
将此与乐观锁定结合使用。在进入编辑模式时,
只有当还没有人将up更新设置为最近的时候,这才会起作用。我们的想法是,如果其他用户已经在工作,我们甚至不允许填充编辑屏幕。但是我们把这个预约定在30分钟后就过期了(或者别的什么),这样就没有什么是永久的“锁定”了。但是请注意,我们并不是(从数据库的角度来说)持有悲观的锁。
现在,这将在遵守预订系统的任何应用程序的两个用户之间进行中介。乐观锁在系统的所有乐观用户之间起中介作用,所以用户仍然有可能被激怒,但是如果你认为带外更新是很少见的,那么你就应该可以获得可接受的可用性。
其他一些想法:
发布于 2009-09-07 07:11:38
在类似的情况下(或乐观锁定),我们实现了第一次写赢机制。
后端:
在数据库中创建时间戳字段(在插入和更新时在MSSQL中自动更新)
加载用于编辑的对象(包括时间戳属性)时,只有在时间戳相同的情况下才允许在存储过程中保存,否则会引发错误,请在应用程序中处理这一点,表明记录已更改,并给它们重新加载页面的机会。这在web/断开连接的环境中工作得很好。
前端
页面需要轮询数据库(使用ajax)来检测更改。如果有更改提示,则用户指示记录已更改,并选择重新加载/合并。在页面回发显示标签或辅助表单字段(只读)上,新输入的值位于可复制的右边,例如指向左边的箭头按钮,将值复制回原始表单字段。
发布于 2009-09-07 07:12:09
我同意你的观点,乐观的锁定并不是用户友好的。
对于悲观的锁定,我认为你可以克服这个问题:
https://stackoverflow.com/questions/1387910
复制相似问题