乐观锁和并发性

3
我的应用程序在医疗记录的多用户环境中运行。 应用程序的重要部分之一是编写医疗记录,医生们应该始终审查当前编写的数据,然后根据需要添加或更正任何信息。
我意识到当两位医生(A,B)同时查看数据时的情况,其中一位将进行更改并保存 (A)。
另一个医生 (B) 仍在编辑旧数据,他不知道医生 (A) 所做的更改。
当医生 (B) 点击保存后,应用程序将比较数据库中的版本列,然后返回错误消息(“数据已被另一个用户更改!”)。
在这种情况下我的问题是:我的解决方案应该有哪些选择。
我正在寻求来自您的经验的专业解决方案或想法。
我的应用程序使用:Java Swing 作为终端用户客户端和 MySQL 数据库。

可能是重复的问题:如何在多用户环境中处理表单编辑? - Ascalonian
没有重复,我可以轻松地采用乐观的方法,并且已经在我的应用程序中成功实现了。所提到的帖子询问如何解决问题。我的问题是:应该给医生(B)提供哪些选项?想象一下,您正在记录并进行写作和编辑,当尝试保存更改时,系统检测到数据更改并丢弃您的更改,您对此情况感到满意吗?那么,在这种情况下,您希望应用程序为您做什么?这就是我的问题。 - user3822563
3
这并不是一种侮辱,但是一个正在开发真实世界医疗系统的人...应该能够至少自己概述潜在的解决方案。当然,与经验丰富的程序员讨论想法总是更好的选择,但是仅仅依靠stackoverflow来告诉你如何设计你的医疗应用程序,哇。而且你知道 - 我们不是你应用程序的用户。转向你的用户,并理解他们希望在这种情况下看到什么。需求来自于用户,而不是stackoverflow。 - GhostCat
我认为在查询中采用悲观写入可以帮助您。 - Nimesh
先生,请问我关于选择的事情,例如:1. 放弃对医生(B)所做的更改。2. 查看具有两个版本的页面,并让医生(B)选择要保留的内容。3. 忽略消息并覆盖医生(A)的更改……等等,您更喜欢哪种方式? - user3822563
显示剩余5条评论
2个回答

2

应该以某种方式通知B医生,他打开的记录已被修改。其余的由您/程序要求决定。A医生的更改是否被覆盖是否重要?是让B医生查看A医生所做的更改,然后决定是否仍应保存B医生所做的更改呢?还是应该合并更改?这都取决于您决定设计的内容以及可能对您正在创建的系统施加的任何要求。如果没有关于您设计的系统或其要求的更多详细信息,那么提供具体答案将是不可能的。


这是一个有趣的答案,对于病历记录,医生(A)所写的内容应该由医生(A)签名并保存为最后更改者,医生(B)在查看患者的其他医生所写的内容之前应该先审查。合并是不可能且不推荐的,但从您的答案中可以看出最好的解决方案是向医生(B)展示一个分割页面,在左侧窗格显示医生(B)最后一次更改的内容,在右侧窗格显示医生(A)所写的内容,然后医生(A)可以从医生(B)的数据中复制所需的数据并在更新中使用,或者放弃他的更新,或覆盖医生(B)的数据。 - user3822563
确切地说,让B知道记录已更改是至关重要的,此外,如何处理这种情况取决于您。最起码,您应该告诉医生B刷新记录并尝试再次更新它,这样B将看到A所做的更改,如果A的更改足够相似,则B甚至可能不需要进行任何更改。 - holtc

0
建议:发送实时通知
如果A进行更改并保存,您可以立即向B发送消息“数据已被其他用户更改!!!”在B保存自己的更改之前。
这种方法类似于stackoverflow。当我写答案时,您可以更改您的问题,我会收到一条消息
编辑该帖子; 点击加载
因此,如果A,B,C ...打开数据集D,他们应该将自己注册为观察者。 您可以通过使用WebSockets或轮询来实现这种方法。

谢谢您提供这个想法,但是我知道轮询会每隔X秒从表中选择一次,有没有其他方法可以使用轮询呢? - user3822563
我个人会使用套接字,因为轮询可能会导致大量不必要的数据库调用,而套接字方法只需要在发生更改时使用,而不是不断地询问是否发生更改。 - holtc
@user3822563,你应该找到一种识别数据集D变化的方法。当然,轮询并不是最好的解决方案。 - dieter
另一件需要记住的事情是:你的应用程序是否允许“离线工作”。如果用户B在网络中断了10秒或10分钟会发生什么? - GhostCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接