与休眠的乐观/悲观锁定并发的良好策略/解决方案



让我们假设我们有一个应用程序"邮件客户端"和一个前端。

如果用户正在键入消息或编辑主题或其他任何内容,则进行休息调用,以更新用户更改的内容(例如接收器)以将消息保留在草稿中。因此,正在发生很多推杆以保存消息。关闭窗口时,同时进行每个可编辑字段的更新。Hibernate无法处理此并发性:每个调用都检索消息,编辑自己的字段并尝试再次保存消息,而另一个调用已经更改了。

我知道我可以同时添加休息调用以保存所有字段,但是我想知道是否有更清洁的解决方案或处理此类案例的体面策略(例如,仅更新一个字段或某个合并策略如果对象已经更改)

预先感谢!

这里最简单的解决方案是将UI调整为

  • 在电子邮件提交期间提交单个休息电话,以完成所有必要的任务。
  • 将其余的呼叫序列化,以便它们被束缚而不是同时启动。

我担心的是,随着越来越多的用户与应用程序进行交互,这将在某个时候滚雪球并成为更大的并发问题。当您面对100、500、1000或什至10000或更多并发用户时,请考虑一下可能的并发REST呼叫的潜在数量。

首先,当负载本身是设计缺陷的产物时,加强服务器的数量来处理该负载真的很有意义吗?

Hibernate旨在通过两种乐观和悲观的机制来处理锁定。

乐观的方式

  1. 从数据存储中读取实体。
  2. 缓存您将在临时变量中修改字段的副本。
  3. 根据您的PUT操作修改字段或字段。
  4. 尝试合并更改。
  5. 如果保存成功,您就完成了。
  6. 如果发生OptimisticLockException,请从数据存储中刷新实体状态。
  7. 将缓存值与您必须更改的字段进行比较。
  8. 如果值有所不同,则可以断言或投掷异常
  9. 如果它们没有区别,请返回4。

乐观的美丽部分是避免发生任何形式的僵局,尤其是如果您允许单独阅读和锁定多个表格。

虽然您可以使用悲观的锁定选项,但乐观的锁定通常是处理并发操作的最佳方法,因为它具有最小的并发竞争和性能影响。

相关内容

最新更新