【问题标题】:What is the most elegant way to prevent working with the same hybris model in different threads? [closed]防止在不同线程中使用相同的 hybris 模型的最优雅的方法是什么? [关闭]
【发布时间】:2018-02-21 13:03:45
【问题描述】:

我正在与 Hybris 合作,并偶然发现了这个问题:

想象一个情况,其中多个线程(可能是 HTTP 线程,可能是后台线程)正在读取/写入同一个数据库项(可能在集群环境中)。如何避免并发问题?有什么选择?

【问题讨论】:

标签: java database spring concurrency hybris


【解决方案1】:

看看数据库锁定:

  • 乐观锁定:每个项目都包含一个字段version。每次更新项目时,都会检查version。仅当您之前加载的项目的版本与数据库中的项目版本匹配时,您才能更新该项目。成功后版本会增加。
  • 悲观锁定:当一个进程打算更新一个项目时,它被锁定,这样在进程释放锁之前其他进程都无法更改它

【讨论】:

  • 如何在 hybris 中使用这些概念?
  • 我不知道 hybris。我的回答解决了您最初不包含 hybris 的问题。对不起
  • 抱歉,因为这是似乎不是针对 hybris 的第二个答案,我意识到我可能错过了这些信息。
【解决方案2】:

我的第一个想法是,如果您在全局线程变量的环境中实现一个版本值,每次访问该项目时都会更改其版本值(例如,您访问的是 0001,现在是 0002),因此,如果他正在使用的版本(例如版本 0001)与保存在服务器中的版本(例如版本 0002)不同,那么在该追逐中,如果您的服务正在对同一项目进行操作。

我希望你能理解这个想法。

【讨论】:

    【解决方案3】:

    在这种情况下,并使用使用缓存的 hybris ORM 实现,我认为您可以:

    服务器端:调整您的业务逻辑以支持并发,并使用缓存驱逐来获取更新的数据。

    数据库端:使用数据库锁定,但这可能会给您的系统带来真正的性能问题。有关数据库锁定的更多信息,请参阅this

    【讨论】:

      【解决方案4】:

      您可以LOCK TABLEin SQL 来防止在进程进行 INSERTS 时发生更改。

      【讨论】:

      • 在 hybris 中,您通常不会使用 SQL 语句,因为 hybris 使用自己的 ORM,称为 Jalo。
      • @JohannesNolteHibernat ORM 语句通常还包括锁语句,例如 Hibernate stackoverflow.com/questions/30323459/…
      • hybris 不使用休眠作为 ORM 实现
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 2011-01-24
      • 2020-04-22
      • 1970-01-01
      相关资源
      最近更新 更多