同一实体的并发更新

时间:2014-03-13 10:52:00

标签: java multithreading hibernate jpa

先生们/女士,

我对同一实体的并发更新有问题。

进程1获取对象集合。这个过程并没有使用Hibernate来检索数据,这对于我来说听起来有点牵强。此过程还使用Hibernate更新集合中某些对象的某些字段。

进程2获取一个类似于集合中某个对象的对象(基本上是DB中的同一行)并以某种方式更新它。这个过程使用Hibernate。

由于流程1和流程2不了解彼此,因此可以更新同一实体,使其处于不一致状态。

例如:

  1. 流程1获取集合
  2. 进程2获取一个实体并删除其某些属性以及链接到
  3. 的实体
  4. 进程1返回并尝试保存该实体并获取实体未找到异常
  5. 我需要处理这种情况。

    那么可以做些什么呢?

    现在我看到两种方式:

    1. 在数据库上创建一个层,用于跟踪系统中的每个实体,有效地禁止创建同一实体的多个实例
    2. 设置乐观锁,因为Hibernate没有获得某些实体,我需要以某种方式实现它
    3. 任何想法都会非常有用

      提前致谢

1 个答案:

答案 0 :(得分:4)

  

由于流程1和流程2彼此不了解,因此可以更新同一实体,使其处于不一致状态。

我重新表述:两个进程都可以更新相同的数据。只有Hibernate知道实体,而另一个进程似乎通过JDBC访问数据。

我会去选项2,这将涉及您实体中的版本列。 然后,IIRC Hibernate会向查询添加WHERE version = x条件,并检查是否所有行都已更新,如果不是,则会抛出OptimistictLockException。您可以在JDBC查询中执行相同操作,即UPDATE ... SET ... version = x + 1 ... WHERE version = x AND additionalConditions,并检查JDBC返回的更新行数。