考虑一个电子商务网站,其中Alice和Bob都在编辑产品清单。爱丽丝(Alice)正在改善描述,而鲍勃(Bob)正在更新价格。他们开始同时编辑Acme Wonder Widget。鲍勃首先完成并用新价格保存产品。爱丽丝花了更长的时间来更新描述,完成后,她用新描述保存产品。不幸的是,她还用原先的价格覆盖了价格,这是不希望的。
以我的经验,这些问题在Web应用程序中极为常见。某些软件(例如Wiki软件)确实对此具有保护作用-通常第二次保存失败,并显示“页面在编辑时已更新”。但是大多数网站都没有这种保护。
值得注意的是,控制器方法本身就是线程安全的。通常,他们使用数据库事务,从某种意义上说,如果爱丽丝和鲍勃试图在同一时刻进行保存,就不会造成损坏,这使它们变得安全。竞争条件是由Alice或Bob在浏览器中拥有过时的数据引起的。
我们如何预防这种比赛条件?我特别想知道:
- 可以使用哪些技术?例如,跟踪上次更改的时间。各自的优缺点是什么。
- 什么是有用的用户体验?
- 此保护内置哪些框架?