处理用户输入并发的好方法是什么?
由于this question的答案已经排除数据库锁定,一般如何处理并发用户输入?
锁定总是一个坏主意,即使它没有通过行锁定实现?是否存在不依赖于用例的最佳实践? 您对策略的体验是什么?
编辑:我知道通过事务处理数据级别的并发:如果两个用户同时触发复杂的数据更改,事务将处理它。
但我有兴趣在GUI层处理或至少对它们做出反应。如果数据更改是用户交互的冗长操作的一部分,该怎么办?
假设有两个或更多用户通过Web界面编辑同一个文件。在某些时候,其中一个用户点击了保存按钮。其他用户发生了什么?
处理此类情况和类似情况的最佳方法是什么?还有其他策略吗?
答案 0 :(得分:5)
最佳策略取决于应该从(业务)流程角度发生的事情 - 同样重要的问题是用户通常期望的内容以及最不会让他们感到惊讶的内容,当然,是否可行实现他们所期望的。
您编辑文件 over web 的示例可按如下方式细分:
请注意,对于Web应用程序而言,通常对于普通的桌面办公程序来说,用户所做的最新更改只有在保存后才能(对其他人)可用,这意味着它不是一个例子。同事的打字出现在你正在编辑的文件副本中。
这种经典的版本控制方法是,与普通的桌面编辑/保存过程相比,user1没有任何变化。
但是,对于user2,当他尝试将v2保存到服务器时,应用程序必须检查自上次用户下载以来文件版本v0是否有任何更改。由于是这种情况,版本控制系统通常会在屏幕上并排显示他的两个版本(v1和v2),让他将它们混合并将生成的版本(v3)保存到服务器。
对于文本文件,Unix和Windows上都有许多工具和系统试图自动化该过程,这样如果编辑的文件区域不重叠,则会自动合并更改。
替代方法是锁定user2的文件,直到user1完成编辑。
在交易中进行编辑通常无关紧要。这是尝试用新版本覆盖现有文件的最终操作,这很重要。编辑在每个用户工作站上独立进行,直到最后一点(保存)才触及服务器。
顺便说一句,你的例子与其他情况明显不同,例如预订机票或预约医生。
预订机票时,飞机座位数量有限。由于数据传输实际上不是一个人将预订放在飞机上的同一个最后一个座位上,因此这是可能的。
因此,预订应该至少分为两个步骤:
“真正仍然免费”的步骤是因为网页用户视图的信息通常不会实时更新,因此在步骤1和步骤2之间,其他用户可能已申请免费插槽。
答案 1 :(得分:2)
了解如何在您使用的任何语言/数据库API中处理“事务”。如果你正确设计它们,它会为你处理它。
要理解这个理论,我建议Distributed Systems by Couloris et al,但还有很多其他好书。