您如何处理/响应GUI层上的用户输入并发?

时间:2008-11-21 10:25:40

标签: language-agnostic concurrency user-input

处理用户输入并发的好方法是什么?

由于this question的答案已经排除数据库锁定,一般如何处理并发用户输入?

锁定总是一个坏主意,即使它没有通过行锁定实现?是否存在不依赖于用例的最佳实践? 您对策略的体验是什么?

编辑:我知道通过事务处理数据级别的并发:如果两个用户同时触发复杂的数据更改,事务将处理它。

但我有兴趣在GUI层处理或至少对它们做出反应。如果数据更改是用户交互的冗长操作的一部分,该怎么办?

假设有两个或更多用户通过Web界面编辑同一个文件。在某些时候,其中一个用户点击了保存按钮。其他用户发生了什么?

  • 他们会收到通知和/或被迫重新加载吗?或者最终是否会覆盖第一个用户的更改?
  • 我应该锁定文件并阻止多个用户编辑同一个文件吗?
  • 我可以将整个编辑过程放在一个交易中(我非常怀疑它,但谁知道......)

处理此类情况和类似情况的最佳方法是什么?还有其他策略吗?

2 个答案:

答案 0 :(得分:5)

最佳策略取决于应该从(业务)流程角度发生的事情 - 同样重要的问题是用户通常期望的内容以及最不会让他们感到惊讶的内容,当然,是否可行实现他们所期望的。

您编辑文件 over web 的示例可按如下方式细分:

  1. user1检查 out / gets / downloads /打开文件v0
  2. user2检查 out / gets / downloads /打开文件v0
  3. user1更改了他的副本 file v0
  4. user2更改了他的副本 file v0
  5. user1将文件版本v1保存到服务器
  6. user2将文件版本v2保存到服务器
  7. 请注意,对于Web应用程序而言,通常对于普通的桌面办公程序来说,用户所做的最新更改只有在保存后才能(对其他人)可用,这意味着它不是一个例子。同事的打字出现在你正在编辑的文件副本中。

    这种经典的版本控制方法是,与普通的桌面编辑/保存过程相比,user1没有任何变化。

    但是,对于user2,当他尝试将v2保存到服务器时,应用程序必须检查自上次用户下载以来文件版本v0是否有任何更改。由于是这种情况,版本控制系统通常会在屏幕上并排显示他的两个版本(v1和v2),让他将它们混合并将生成的版本(v3)保存到服务器。

    对于文本文件,Unix和Windows上都有许多工具和系统试图自动化该过程,这样如果编辑的文件区域不重叠,则会自动合并更改。

    替代方法是锁定user2的文件,直到user1完成编辑。

    在交易中进行编辑通常无关紧要。这是尝试用新版本覆盖现有文件的最终操作,这很重要。编辑在每个用户工作站上独立进行,直到最后一点(保存)才触及服务器。


    顺便说一句,你的例子与其他情况明显不同,例如预订机票或预约医生。

    预订机票时,飞机座位数量有限。由于数据传输实际上不是一个人将预订放在飞机上的同一个最后一个座位上,因此这是可能的。

    因此,预订应该至少分为两个步骤:

    1. 系统显示空闲插槽;
    2. 用户要求其中一个免费插槽 (S1);
    3. 系统告诉用户是否有插槽 真的还是免费的,如果是的话, 保留给你。
    4. 用户完成预订。
    5. “真正仍然免费”的步骤是因为网页用户视图的信息通常不会实时更新,因此在步骤1和步骤2之间,其他用户可能已申请免费插槽。

答案 1 :(得分:2)

了解如何在您使用的任何语言/数据库API中处理“事务”。如果你正确设计它们,它会为你处理它。

要理解这个理论,我建议Distributed Systems by Couloris et al,但还有很多其他好书。