Language agnostic 如何在GUI层处理/响应用户输入并发性?

Language agnostic 如何在GUI层处理/响应用户输入并发性?,language-agnostic,concurrency,user-input,Language Agnostic,Concurrency,User Input,处理用户输入并发的好方法是什么 作为已经排除数据库锁定的答案,您通常如何处理并发用户输入 即使不是通过行锁定实现,锁定是否始终是一个坏主意?是否存在不依赖于用例的最佳实践? 你对你的策略有什么经验 编辑:我知道通过事务在数据级别处理并发:如果两个用户同时触发复杂的数据更改,事务将处理它 但我感兴趣的是在GUI层上处理或至少对它们作出反应。如果数据更改是长时间用户交互操作的一部分,该怎么办 假设两个或多个用户正在通过web界面编辑同一文件。在某个点上,其中一个用户点击保存按钮。其他用户怎么了 他

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

作为已经排除数据库锁定的答案,您通常如何处理并发用户输入

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

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

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

假设两个或多个用户正在通过web界面编辑同一文件。在某个点上,其中一个用户点击保存按钮。其他用户怎么了

  • 他们会得到通知和/或被迫重新装载吗?还是最终会覆盖第一个用户的更改
  • 我应该锁定文件并防止多个用户编辑同一文件吗
  • 我可以把整个编辑过程放在一个事务中吗(我非常怀疑,但谁知道…)
处理这种情况和类似情况的最佳方法是什么?还有其他策略吗?

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


为了理解这一理论,我推荐其他很多好书。

最佳策略取决于从(业务)流程的角度看应该发生什么-同样重要的问题是用户通常会期望什么,什么会让他们最不惊讶,当然,实现他们期望的东西是否可行

您通过web编辑文件的示例可以分解如下:

  • 用户1检查 输出/获取/下载/打开文件v0
  • 用户2检查 输出/获取/下载/打开文件v0
  • user1对其的副本进行更改 文件v0
  • user2对其的副本进行更改 文件v0
  • user1将文件版本v1保存到服务器
  • user2将文件版本v2保存到服务器
  • 请注意,用户所做的最新更改只有在保存后(对其他人)才可用,这对于web应用程序来说是很典型的,对于普通桌面办公程序也是如此,这意味着在您正在编辑的文件副本中,同事的输入不会出现在您的输入之上

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

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

    对于文本文件,Unix和Windows上都有许多工具和系统,它们试图自动化该过程,以便在编辑的文件区域不重叠的情况下,自动合并更改

    另一种方法是锁定user2的文件,直到user1完成编辑

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


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

    订票时,飞机上的座位有限。这是有可能的,因为事实上,数据传输并不是一个以上的人在飞机上预定同一最后一个座位的瞬间

    因此,预订至少应分两步进行:

  • 系统显示空闲插槽
  • 用户请求一个空闲插槽 (s1)
  • 系统告诉用户插槽是否正确 还是免费的,如果是的话, 把它留给你
  • 用户完成预订
  • “真正仍然免费”步骤是因为网页用户视图上的信息通常不会实时更新,因此在步骤1和步骤2之间,可能有其他用户申请了免费时段