让我们假设我们有一个应用程序"邮件客户端"和一个前端。
如果用户正在键入消息或编辑主题或其他任何内容,则进行休息调用,以更新用户更改的内容(例如接收器)以将消息保留在草稿中。因此,正在发生很多推杆以保存消息。关闭窗口时,同时进行每个可编辑字段的更新。Hibernate无法处理此并发性:每个调用都检索消息,编辑自己的字段并尝试再次保存消息,而另一个调用已经更改了。
我知道我可以同时添加休息调用以保存所有字段,但是我想知道是否有更清洁的解决方案或处理此类案例的体面策略(例如,仅更新一个字段或某个合并策略如果对象已经更改)
预先感谢!
这里最简单的解决方案是将UI调整为
- 在电子邮件提交期间提交单个休息电话,以完成所有必要的任务。
- 将其余的呼叫序列化,以便它们被束缚而不是同时启动。
我担心的是,随着越来越多的用户与应用程序进行交互,这将在某个时候滚雪球并成为更大的并发问题。当您面对100、500、1000或什至10000或更多并发用户时,请考虑一下可能的并发REST呼叫的潜在数量。
首先,当负载本身是设计缺陷的产物时,加强服务器的数量来处理该负载真的很有意义吗?
Hibernate旨在通过两种乐观和悲观的机制来处理锁定。
乐观的方式
- 从数据存储中读取实体。
- 缓存您将在临时变量中修改字段的副本。
- 根据您的
PUT
操作修改字段或字段。 - 尝试合并更改。
- 如果保存成功,您就完成了。
- 如果发生
OptimisticLockException
,请从数据存储中刷新实体状态。 - 将缓存值与您必须更改的字段进行比较。
- 如果值有所不同,则可以断言或投掷异常
- 如果它们没有区别,请返回4。
乐观的美丽部分是避免发生任何形式的僵局,尤其是如果您允许单独阅读和锁定多个表格。
虽然您可以使用悲观的锁定选项,但乐观的锁定通常是处理并发操作的最佳方法,因为它具有最小的并发竞争和性能影响。