【问题标题】:Optimistic locking & concurrency乐观锁和并发
【发布时间】:2015-04-07 20:20:32
【问题描述】:

我的应用程序在医疗记录的多用户环境中工作。 应用程序的重要部分之一是编写医疗记录,医生应始终查看当前的书面数据,然后根据需要添加或更正任何信息。

我知道当 2 位医生 (A,B) 同时查看数据时,其中一位会进行更改并点击保存 (A)。

另一位医生 (B) 仍在编辑旧数据,他不知道医生 (A) 应用的更改。

当医生(B)点击保存时,应用程序将比较数据库中的版本列,然后应用程序返回错误消息(“数据已被另一个用户更改!!!”)。

在这种情况下我的问题:我的解决方案中应该有哪些选择。

我正在根据您的经验寻求专业的解决方案或想法。

我的应用程序使用:用于最终用户客户端和 MySQL 数据库的 Java Swing。

【问题讨论】:

  • 没有重复,我可以很容易地使用乐观的方法并且它在我的应用程序中成功实现,提到的帖子询问如何解决问题。我的问题是:应该给医生(B)什么选择?想象一下您正在记录并在尝试保存更改时编写和编辑后,系统检测到数据更改并丢弃您的更改,您对这种情况感到满意吗?那么,在这种情况下,您希望应用程序为您做什么?这是我的问题。
  • 这不是侮辱;但好吧:一个正在开发现实世界医疗系统的人......应该真的能够至少自己概述潜在的解决方案。当然,与有经验的程序员讨论想法总是更好的;但是依靠 stackoverflow 来告诉您如何设计您的医疗应用程序;哇。而且您知道 - 我们不是您应用程序的用户。转向您的用户,了解他们在这种情况下希望看到什么。需求来自用户;不是来自stackoverlow。
  • 我认为悲观的写在查询可以帮助你
  • 陛下,我问的是选择,例如。 1. 放弃对医生 (B) 的更改。 2.查看包含两个版本的页面并让医生(B)选择要保留的内容。 3. 忽略消息并覆盖医生 (A) 的更改。 ...等等你喜欢什么?

标签: java mysql


【解决方案1】:

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

【讨论】:

  • 这个有趣的答案,对于医生 (A) 写的医疗记录,应由医生 (A) 保存并签名,最后更改为,医生 (B) 应查看其他医生之前写的关于患者的内容.合并它是不可能的,也不推荐,但是从你的回答中我可以看到最好的解决方案是向医生(B)显示一个拆分页面,在左窗格中显示医生(B)的最后更改,在右窗格中显示医生( A) 写了,然后医生 (A) 可以从医生 (B) 数据中复制一些需要的数据并在他的更新中使用它,或者丢弃他的更新,或者覆盖医生 (B) 数据。
  • 没错,必须让 B 知道记录已被更改,并且在此之后,由您决定如何最好地处理这种情况。至少,您应该告诉医生 B 刷新记录并尝试再次更新,这样 B 就会看到 A 所做的更改,然后如果 A 的更改足够相似,甚至可能不需要进行任何更改
【解决方案2】:

建议:发送实时通知

如果 A 进行更改并点击保存,您可以立即向 B 发送消息“数据已被其他用户更改!!!” > 在B保存他的更改之前。

这种方法类似于stackoverflow。当我写下我的答案时,您可以更改您的问题,我会收到一条消息

已对该帖子进行了编辑;点击加载

所以如果 A,B,C... 打开数据集 D,他们应该将自己注册为观察者。 您可以通过使用 websockets 或轮询来实现此方法。

【讨论】:

  • 感谢这个想法,但据我所知,轮询会在每 X 秒内不断从表中进行选择,是否有使用轮询的方法?!
  • 我个人会使用套接字,因为轮询可能会导致大量不必要的数据库调用,而套接字方法只需要在进行更改时使用,而不是不断询问是否进行了更改。
  • @user3822563 你应该找到一种方法来识别数据集D的变化。当然轮询不是最好的解决方案。
  • @user3822563 要记住的另一件事:您的应用程序是否允许“离线工作”。如果用户 B 断网 10 秒会发生什么;还是 10 分钟?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
相关资源
最近更新 更多