处理用户输入并发的好方法是什么?
由于这个问题的答案已经排除了数据库锁定,你如何处理并发用户输入呢?
锁定总是一个坏主意,即使它没有通过行锁定实现?是否存在不依赖于用例的最佳实践?您对策略的体验是什么?
编辑:我知道通过事务处理数据级别的并发:如果两个用户同时触发复杂的数据更改,事务将处理它.
但我有兴趣处理或至少在GUI层上对它们做出反应.如果数据更改是用户交互的冗长操作的一部分,该怎么办?
假设两个或更多用户正在通过Web界面编辑同一文件.在某些时候,其中一个用户点击了保存按钮.其他用户发生了什么?
他们会得到通知和/或被迫重新加载吗?或者最终是否会覆盖第一个用户的更改?
我要锁定文件并阻止多个用户编辑同一个文件吗?
我可以将整个编辑过程放在一个交易中(我非常怀疑它,但谁知道...)
处理这种情况和类似情况的最佳方法是什么?还有其他策略吗?
最佳策略取决于(业务)流程视角应该发生什么- 重要的问题是用户通常会期望什么,最不会让他们感到惊讶,当然,实现他们期望的是否可行.
您在网络上编辑文件的示例可以细分如下:
user1检出/获取/下载/打开文件v0
user2检出/获取/下载/打开文件v0
user1更改其文件v0的副本
user2更改其文件v0的副本
user1将文件版本v1保存到服务器
user2将文件版本v2保存到服务器
请注意,这是正常的桌面办公程序典型的Web应用程序,而事实上,那就是,最新的变化是用户对他们节省后才变得可用(他人),这意味着它是没有同事的打字出现的情况下,在您正在编辑的文件副本中.
对此,经典版本控制方法是,与普通桌面编辑/保存过程相比,user1没有任何变化.
但是,对于user2,当他尝试将v2保存到服务器时,应用程序必须检查自上次用户下载以来文件版本v0是否有任何更改.既然是这样的话,版本控制系统通常会表现出他对侧屏幕一侧的两个版本(v1和v2),并让他把他们所得的版本(第三版)保存到服务器.
文本文件存在一些在Unix和Windows的工具和系统,尝试的过程自动化,这样,如果编辑不重叠文件的地区,更改会自动合并.
另一种方法是锁定user2的文件,直到user1完成编辑.
在交易中进行编辑通常无关紧要.这是尝试用新版本覆盖现有文件的最终操作,这很重要.编辑在每个用户工作站上独立进行,直到最后一点(保存)才触及服务器.
顺便说一句,您的例子与另一种情况明显不同,例如预订机票或预约医生.
预订机票时,飞机上的座位数量有限.由于数据传输实际上不是一个人将预订放在飞机上的同一个最后一个座位上的事实,因此这是可能的.
因此,预订应至少分为两步:
系统显示空闲插槽;
用户要求一个空闲时隙(s1);
系统告诉用户插槽是否仍然是空闲的,如果是,则保留给您.
用户完成预订.
的"真的还是免费"步骤是因为网页用户意见信息典型地不更新实时,所以步骤1和2之间,有可能是其他用户已申请的空闲时隙.