以下是我想在 Web 应用程序中执行的两个潜在工作流程。
变化1
- 用户发送请求
- 服务器读取数据
- 服务器修改数据
- 服务器保存修改后的数据
变化2:
- 用户发送请求
- 服务器读取数据
- 服务器向用户发送数据
- 用户发送带有修改的请求
- 服务器保存修改后的数据
在每种情况下,我想知道:确保对该服务的并发访问将产生合理结果的标准方法是什么? (即没有人的编辑被破坏,值对应于编辑的某些顺序等)
这种情况是假设的,但以下是我在实践中可能需要处理此问题的一些细节:
- Web 应用程序,但未指定语言
- 可能,使用网络框架
- 数据存储是 SQL 关系数据库
- 涉及的逻辑太复杂,无法在查询中很好地表达,例如值 = 值 + 1
我觉得我不想在这里尝试重新发明轮子。当然,这些都是众所周知的问题,也有众所周知的解决方案。请指教。
Thanks.
据我所知,这个问题没有通用的解决方案。
问题的根源在于,用户可能会检索数据并在屏幕上盯着它很长时间,然后再进行更新和保存。
我知道三种基本方法:
当用户读取数据库时,锁定记录,直到用户保存任何更新后才释放。实际上,这是非常不切实际的。如果用户打开一个屏幕然后去吃午饭而不保存怎么办?还是回家休息一天?或者是因为试图更新这个愚蠢的记录而感到沮丧,以至于他退出并且再也没有回来?
将您的更新表示为增量而不是目的地。举一个经典的例子,假设您有一个记录库存的系统。每次有销售时,您必须从库存数量中减去 1(或更多)。
假设现有数量为 10。用户 A 创建了一笔销售。当前数量 = 10。用户 B 创建销售。他还得到当前数量 = 10。用户 A 输入已售出两个单位。新数量 = 10 - 2 = 8。保存。用户 B 输入已售出的一件商品。新数量 = 10(他加载的值) - 1 = 9。保存。显然,出了问题。
解决方案:不要编写“更新库存集数量=9,其中 itemid=12345”,而是编写“更新库存集数量=数量-1,其中 itemid=12345”。然后让数据库对更新进行排队。这与策略 #1 有很大不同,因为数据库只需锁定记录足够长的时间即可读取、更新和写入。当有人盯着屏幕时,它不必等待。
当然,这仅适用于可以表示为增量的更改。比如说,如果您要更新客户的电话号码,这是行不通的。 (例如,旧号码是 555-1234。用户 A 说将其更改为 555-1235。这是 +1 的更改。用户 B 说将其更改为 555-1243。这是 +9 的更改。所以总更改是+10,客户的新号码是 555-1244。:-) ) 但在这种情况下,“最后一个单击 Enter 键的用户获胜”可能是您能做的最好的选择。
- 更新时,检查数据库中的相关字段是否与您的“来自”值匹配。例如,假设您在一家律师事务所工作,为您的客户谈判合同。您有一个屏幕,用户可以在其中输入有关谈判的注释。用户A调出一条合同记录。用户B调出相同的合同记录。用户 A 输入,他刚刚通过电话与另一方通话,并且他们同意所提议的条款。用户 B 也一直试图给对方打电话,他输入说他们没有回复电话,他怀疑他们在阻挠。用户 A 单击“保存”。我们是否希望用户 B 的评论覆盖用户 A 的评论?可能不会。相反,我们显示一条消息,指示自他读取记录以来注释已更改,并允许他在决定是否继续保存、中止或输入不同内容之前查看新值。
[注意:论坛会自动对我的编号列表重新编号。我不知道如何覆盖这个。]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)