在多进程场景中,hibernate中的合并操作会覆盖数据

时间:2017-06-13 21:08:35

标签: hibernate jpa concurrentmodification

我有一个表,它由同时运行的两个不同进程更新。我在我的实体上使用DynamicUpdate注释。我正面临以下问题,

  1. 进程1读取状态为A
  2. 的数据
  3. 进程2在进程1运行但尚未完成时读取状态为A的数据。
  4. 流程2已完成并更新状态B(使用状态列上的动态更新)
  5. 进程1已完成并更新其他列,但也将状态更改回A.(进程1使用动态更新而不是更新状态列)
  6. 请提出上述行为的可能原因。请注意,我正在使用JPA + hibernate和Spring事务。

    任何快速指针都非常有用。

1 个答案:

答案 0 :(得分:0)

可以通过在该实体上使用单独的@Version属性来解决问题。因此,当进程1和进程2将在同一实体上工作时。如果任何人更新该行,版本将自动递增。当另一个进程倾向于更新同一行时,它会发现版本不匹配,并将抛出一个乐观异常,你可以简单地捕获异常并可能向用户显示一条包含特定错误的错误消息,例如{{1 }}。

所以,只需添加如下属性: ooops sorry. someone has updated the row already

这就是全部。 希望它有所帮助